2D渲染引擎中的脏矩形技术

2D游戏技术其实都已经很古老了,主要包括像素运算,Blt,脏矩形等一些技术。

所谓脏矩形技术,就是哪里脏了,就(仅仅)把脏了的那块区域重绘。而不是每次直接性的重绘。

其基本条件是:脏矩形的计算和绘制的代价小于直接性重绘。换句话说,如果一个屏幕每一帧变化的东西太多的话,就不值得用这个古老的算法了。

脏矩形要解决的两个问题是:
(1) 什么叫脏,即什么情况下会弄脏

当我们的游戏中的元素(通常是RenderObject)发生位置,大小,方向,动画,添加,删除等操作时,那么该元素原来对应的区域会弄脏,同时,新对应的区域也同样被弄脏。

(2) 弄脏的区域该怎么办

把场景分成一个一个的格子(比如12864或者6432,矩形格或菱形格);
每个格子,有一个是否脏的标记,以及其上的RenderObject列表;
每个RenderObject,可以保存一个对应的格子列表(当然,也可以计算,并且,实际上有两个格子列表,变化之前和变化之后分别对应一个格子列表,对于变化前的,对应的格子列表中的每个格子应当删除该物体,对于变化后的,对应的格子列表中的每个格子应当添加该物体)

每次绘制时,按照某种顺序,绘制脏了的格子;
每个脏了的格子,按照某种顺序,将其上的RenderObject裁剪绘制到格子的区域上;

关于脏矩形技术的必要性,cloud在《我的编程感悟》一书中已经有了详细的论证。此外,书中提到的关于Blt的汇编优化,逆向画家算法,图像压缩,精灵优化,滚屏优化,以及限制内存大小的思想,都是2D游戏值得借鉴的。

Leave a Reply

Your email address will not be published. Required fields are marked *