[技术讨论帖] surface view Canvas 与 dirty Rect

Daniel_Cao_ 2013-01-28 10:01:54

各位技术达人, 最近在研究图形图像 渲染和动画的东东。 遇到了一个问题,就是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。如何调用这个方法呢。
而且我实际操作了一下,还是会出现闪屏的情况。

不知道哪位仁兄遇到过这样的问题,望不吝赐教啊。呵呵。

也希望大家一起讨论一下,交流交流。
...全文
107 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧