使用SurfaceView中的Surface对象进行绘图,其本质就是利用SurfaceHolder的lockCanvas获取到Canvas对象进行绘制的,对于绘制动画来说,必须使用双缓冲,或者采用双线程,一个线程负责专门的预处理,比如图片数据读取,另外一个线程负责进行专绘制图形。因为SurfaceView每次绘图都会锁定Canvas,也就是说同一片区域这次没画完下次就不能画,因此要提高动画播放的效率,就得开一条线程专门画图,开另外一条线程做预处理的工作。
下在给出一个例子,讲解一下如何利用双线程提高绘图速度:
以下可以看到的动画是一张解码后的图片从最屏幕最左边快速移到右边,重新开始则清屏进行显示
- 2楼tianshenshangjie5天前 18:46
- 你确定?
- Re: andyhuabing5天前 18:46
- 能说明清楚一点不?不太明白你的意思
- 1楼tianshenshangjie6天前 16:51
- 为什么要2线程,为什么不直接在绘制的时候就先预先加载好。为什么不去做一个处理就是绘制的时候加载。如果第一次加载了那么后续就不去再重复夹杂的处理。等等。太多太多
- Re: andyhuabing5天前 09:40
- 首先谢谢你的建议,在此我说下我的看法:n1、预先加载好,对于大图片内存消耗比较大,vm虚拟机很容易就报内存不够的n2、分为两个线程处理,分开加载和绘图两个过程,假如解码的图片很大,需要花费时间解码,而如果直接在绘图时进行解码,将会影响到绘图的速度,对于动画的效果将会不流畅
- Re: tianshenshangjie5天前 10:26
- 回复andyhuabingn其实我完全是抱着质疑的态度来的。第一你开了一个线程去加载图片。是否会照成图片重复加载。或者反复去开io流读取图片,反复加载的情况下还没有去做上一个图片的释放工作。这比一次性加载更容易爆内存。。第二假如解码的图片很大,需要花费时间解码,而如果直接在绘图时进行解码,将会影响到绘图的速度,对于动画的效果将会不流畅 这个是说绘制的时候进行加载,绘制的时候进行加载只是我提出的一个想法。他也确实不合适大图片的加载。第三因此要提高动画播放的效率,就得开一条线程专门画图,开另外一条线程做预处理的工作。你确定要这样。为什么这样做可以达到这种效果
- Re: andyhuabing5天前 10:41
- 对于SurfaceView这点我也是刚学并且使用的,刚去问了一下专做android应用的专业人员,解码与绘图应该分开进行,前提肯定是不能一次解完全放在内存中。解码放在单独一个线程中,而绘图肯定由ui线程绘制。这种方式是目前能知道最好的!
- Re: andyhuabing5天前 11:05
- 不知道你有什么高见,不防一起互相学习下,谢谢!