[技术讨论帖] surface view Canvas 与 dirty Rect
各位技术达人, 最近在研究图形图像 渲染和动画的东东。 遇到了一个问题,就是surface view的双缓冲和全屏重绘的问题。
具体描述一下:
surface view 实现动画时,需要holder.lockCanvas 锁住“操作”Canvas ,在这个Canvas上绘制你的帧图,解锁后,底层会做一个swap操作,“显示”Canvas 与“操作”Canvas交换,实现双缓冲,避免闪屏。
那么这里有一个效率和内存的矛盾问题:就是每帧都要全屏重绘。
假如我的每一帧都会有很多的“图元素”,每一次动画的,只有其中以少部分。也就是“更新”区域是屏幕中的一小部分。每次都需要全屏重绘的话,会降低帧频,达不到平滑动画的效果。
上面的解决办法就是用一个Bitmap 作为中间层,new Canvas(Bitmap) ,将需要更新的内容绘制到这个bitmap 上,再将bitmap 绘制到实际的canvas上(lock的那个canvas)。 但是这样就会呆了额外内存的消耗,(现在android都是大屏,高分辨率的,这个内存还是很可观的。1280*720 约4M左右)。
感觉一定有一个好的方法来解决。看到holder.lockCanvas(Rect dirty) 这个方法,但实在不理解他如何使用。上我上面的需求,可能会有一个离散的dirtyRect list。如何调用这个方法呢。
而且我实际操作了一下,还是会出现闪屏的情况。
不知道哪位仁兄遇到过这样的问题,望不吝赐教啊。呵呵。
也希望大家一起讨论一下,交流交流。