Android帧动画/AnimationDrawable导致的OOM/ANR的解决方案

作者&投稿:尉迟狱 (若有异议请与网页底部的电邮联系)
~

如果有播放超多帧动画的需求,直接点击 FrameAnimation 在github查看,基本能满足你的所有需求,就不用往下看了,基本能满足 99.99% 人的需求。

       当在应用中需要使用帧动画的时候,最先想到的就是Android提供的AnimationDrawable了,但是如果帧动画中如果包含上百帧图片,此时再用AnimationDrawable就不是那么理想了。AnimationDrawable使用一个Drawable数组来存储每一帧的图像,会直接把全部图片加载进内存。随着帧数量的增多,就算性能再强劲的机器也会卡顿、OOM。

    最近的项目中需要用到大量的帧动画(各种闪瞎24K钛合金狗眼的礼物效果,多的高达200帧),既然AnimationDrawable不行,就想到了两种解决方法。

   因为是直播的项目,包含人脸贴图等都是用opengl绘制的,如果用OpenGL绘制一层Texture直接推流还省事。只在主播端处理就行了,但是IOS那边都弄得差不多了,直接原生的不用处理也不会有什么异常什么的。。很尴尬。

    好吧,第一个不行那就想到Android自带的surfaceView啦。我首先用不同的手机测试了下应用从本地decode一个bitmap的时间(png格式,414*736,大小在30-100k之间),因为帧动画的每帧不会太大,在性能好点的设备上基本保持在10-30ms之间(不推流基本上推流状态下10ms左右,推流状态下20左右),在性能稍差的设备中基本上也不会超过50ms,所以说是没什么大问题的。

既然不能完全加载到内存,想到的就是类似视频播放或者视频直播类似的思路。首先定义一个Bitmap的缓冲区,边绘制边加载。首先加载一定数量的帧到Bitmap缓冲区,加载完成后通知SurfaceView开始绘制。SurfaceView绘制一帧完成后通知Bitmap缓冲区加载下一帧,同时将绘制过的一帧的从Bitmap缓冲区移除。一帧绘制完成后,绘制线程根据设置的帧间隔休眠一段时间,休眠完成后开始从Bitmap缓冲区获取下一帧,依此类推,一直循环,直到播放完成或者手动停止。按照这种方式实现起来,发现oom卡顿什么的果然不存在了,内存的使用情况如图。

但是看着这个垃圾桶一个挨一个,这个内存回收情况完全不正常!GC太频繁了。想着应该是这里出现了问题。[图片上传失败...(image-96f387-1512626035688)]
频繁的添加移除bitmap,导致了不算太严重的内存抖动。之所以称之为不算太严重,因为大概400ms一次,一次gc花费2ms左右。不看内存,只看运行效果。真的感觉不出来。但是呢,这样显然也是不行滴。

最常见的解决方法就是对象的复用,创建各种pool。Android也提供了Bitmap的复用方式,在加载bitmap的时候传入一个inBitmap,那么加载的bitmap就会复用原bitmap的内存空间,所以理论上将要复用的bitmap和新加载的bitmap在颜色深度一样的情况下,复用的bitmap宽高要大于新加载的bitmap。50L的桶毕竟最多只能装50L的水。关于inBitmap更多资料可以参考 这里 , 还有这里 。(请自备梯子)。 使用起来很简单,大概就是这样

然后实现思路就是在这里修改了,把将要删除的哪一帧留下来作为inBitmap。




超好用的14款免费视频编辑软件强烈推荐!剪辑达人必备!(2022)
1. **OpenShot Video Editor** - 这款跨平台软件以其直观的界面和全面功能赢得新手青睐。它支持字幕添加、缩放、编辑,以及绿幕效果和关键帧动画,同时提供水印、自定义模板和拖放文件操作。适用于Windows、Mac、Linux用户。2. **VSDC Free Video Editor** - 虽然免费版功能有限,但付费版扩展了视频...

adobephotoshop是什么软件
比如,摄影师会用它来修图,美工会用它来做海报,插画师会用它来绘图等。简单来说,Photoshop就是涵盖了设计、修图、画图这三大主要操作。当然,你也可以用它制作GIF动图,输出一些简单的帧动画等内容。AdobePhotoshop兼容Windows、MacOS、Android、iOS等平台。需要注意的是,手机版的Photoshop,功能会有大量...

全民格斗王为什么下架了怎么下载
深度还原街头霸王的英雄角色和视觉场景,感受指尖热血pk的微操体验,1v1秀出你的风骚操作,来墨鱼下载站抢先试玩吧!果盘游戏全民格斗王亮点全民格斗王是目前唯一采用2D骨骼动画的格斗游戏,与那些动辄几百M的帧动画火3D效果相伴,全民格斗王可以满足低配android机的完美游戏。2D骨骼动画不仅能够满足每个角色...

FLASH是什么意思
)用光发出(信号);(快速地)显示;飞速运动;突然想到;(使)闪现,映出,显示;(通过无线电、计算机等)快速发送(信息);突然显露(强烈情感。n.闪光;闪耀;(尤指信号灯)闪亮;(想法的)突现;(情感的)突发;(明亮的东西)闪现;闪光灯;徽章,肩章,臂章;彩条;Flash网站动画制作程序。adj.庞大的;昂贵...

flash指的是什么
4、要在Flash中构建应用程序,可以使用Flash绘图工具创建图形,并将其它媒体元素导入Flash文档,再定义该如何使用各个元素构建应用程序;5、Flash动画说到底就是【遮罩】+【补间动画】+【逐帧动画】与元件(主要是影片剪辑)的混合物,通过这些元素的不同组合,从而可以创建千变万化的效果。

能做动图表情包的软件叫什么
3、 扫描或拍摄手绘稿(尽可能保持镜头和画面之间的平行),打开Illustrator,导入照片,新建图层,描出手绘稿上的所有线条。调整线条,填充颜色,一帧用单独一个图层,按动画帧的序列排列图层并命名。4、打开Photoshop,按序列帧顺序复制图层上的内容到PS中,一个图层一帧。在顶部菜单栏依次打开“窗口” ...

Flash如何插入600s以后的关键帧?
并将其改名为Flash。后又于2005年12月3日被Adobe公司收购。Flash通常也指Macromedia Flash Player(现Adobe Flash Player)。2012年8月15日,Flash退出Android平台,正式告别移动端。2015年12月1日,Adobe将动画制作软件Flash professional CC2015升级并改名为Animate CC 2015.5,从此与Flash技术划清界限 ...

Android UI 的设计规则
Android UI 的设计规则 也就是比如我ps设计好了UI界面以后,如何切图才能符合程序的要求,越详细越好...重复所有4位和8位帧。若要保存图标,请选择 File->Save Icon As...。创建工具栏Windows工具栏图标...著名的网页动画制作软件flash从3.0到4.0,仅仅修改了图标和窗体,立即大为增色… 现今世界上成功的软件...

android网络编程学什么,如何学习android网络编程
1.9 Android程序签名打包 1.11 反编译APK获取代码&资源 2.1 View与ViewGroup的概念 2.2.1 LinearLayout(线性布局)2.2.2 RelativeLayout(相对布局)2.2.3 TableLayout(表格布局)2.2.4 FrameLayout(帧布局)2.2.5 GridLayout(网格布局)2.2.6 AbsoluteLayout(绝对布局)2.3.1 TextView(文本框)...

手机有什么好的剪辑软件
ps:排名不分先后,各位看官有好用的推荐,可在评论区发布~1、AndroVid 《AndroVid Pro》是一个非常好用的视频编辑器,拥有许多实用的功能,如修剪、分割以及抓取视频帧,对N多音频和视频格式转换等,并且可以分享您编辑过的视频。2、KineMaster 《巧影 KineMaster》是一款在Android系统上运行的顶尖视频...

依安县17565391755: Android中帧动画在Activity启动时自动运行的几种方式 -
壬姣筋伤: 帧动画:第一种方式启动帧动画:(在Activity启动时会自动运行动画)AnimationDrawable ad;ImageView iv = (ImageView) findViewById(R.id.animation_view);iv.setBackgroundResource(R.drawable.animation);ad = (AnimationDrawable) iv....

依安县17565391755: Android 中的动画有哪几类,它们的特点和区别是什么? -
壬姣筋伤: Android 中的动画有帧动画,补间动画,属性动画,她们的忑点和使用方法如下:###帧动画> 一张张图片不断的切换,形成动画效果* 在drawable目录下定义xml文件,子节点为animation-list,在这里定义要显示的图片和每张图片的显示时长 * ...

依安县17565391755: android如何设置Drawable Animation逐帧动画每一帧的持续时间 -
壬姣筋伤: 一.原理: 对几张图片按照顺序一张一张进行播放,视觉上感觉是连续播放的动画效果. 二.步骤: 1.在res/drawable放入几张图片 2.在res/drawable下新建一个drawable resource file,比如命名为gril_animation.xml,根节点选择animation-list,点击ok3.编辑gril_animation.xml文件,以animation-list作为根节点,item作为子节点,每个item就是一帧,即一个drawable图片 图片资源是在百度上搜索帧动画找的,然后用了一个很笨的办法,一小张一小张截下来的,总之能用就行了,不要求太完美了@-@

依安县17565391755: android 帧动画 如何在代码中设置时长 -
壬姣筋伤: 嗯,如果你的图片也是采用代码加载的话,可以如下这么写123 mFrameAnimation = newAnimationDrawable(); mFrameAnimation.addFrame(getResources().getDrawable(R.drawable.icon1), 200); mFrameAnimation.addFrame(getResources()....

依安县17565391755: android逐帧动画如何让动画停在最后一张 -
壬姣筋伤: 在工程res文件目录下新建一个anim文件夹,在里面新建一个start_animation.xml格式文件,此文件用来定义动画播放图片的顺序及每一张图片显示停留时间.在这里增加android:oneshot="true"属性, 会停留在最后一帧

依安县17565391755: Android 帧动画何时停止播放 -
壬姣筋伤: 可以通过一些其他方式来做到.方式一,当动画开始start之后,我们可以通过检测是否到达帧动画的最后一帧,来确定动画是否播完.这种方式可以保证动画播完.方式二,重写AnimationDrawable,获得totalDuration,然后动画start之后的totalDuration,调用结束的接口回调onAnimationFinshed().为什么必须重写呢?因为,AnimationDrawable仅提供了每一帧的duration,而不能直接获得动画总的duration.当然还有一些变种的方法,但是其大体思路都应该差不多.至于动画是否流畅播放,这要取决于你播放动画的时候,系统的繁忙程度.

依安县17565391755: android之animator 和animation 的区别 -
壬姣筋伤: 你好.animator代表的是属性动画,改变的是 View属性的值;animation代表的是帧动画,不改变 View 属性的值.

依安县17565391755: android?上如何实现帧动画和补间动画的组合动画呢 -
壬姣筋伤: 表示关注,AnimationSet 好像只能实现楼主说的四种补间动画的组合.帧动画AnimationDrawable加不进去.实在不行就等帧动画结束时在调用AnimationSet ..

依安县17565391755: Android中属性动画和补间动画的区别 -
壬姣筋伤: Android属性动画和补间动画,既是日常工作中经常接触到的技术,也是面试常考的问题.这篇博客主要是为了介绍Android的属性动画使用,同时带着大家总结一下关于面试过程中常被面试到的动画问题.关于补间动画,可以参考之前的博客:Android动画学习——Tween Animation http://blog.csdn.net/wzy_1988/article/details/50587248

依安县17565391755: 为什么android逐帧动画没有效果 -
壬姣筋伤: 因为所有界面元素在加载中.有个不确定的解决方法.imageView.post( new runable(){ run(){ runOnUiThread( new runable(){run(){这里表达你的动画.}})} } 顺便说下,在onResume前,提取getLocationOfScreen(window)也是无效的,理由一样.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网