理论教育 SurfaceView绘图:覆盖刷新与脏矩形优化

SurfaceView绘图:覆盖刷新与脏矩形优化

时间:2023-06-19 理论教育 版权反馈
【摘要】:SurfaceView在Android中用作游戏开发是最适宜的,本文就将演示游戏开发中常用的两种绘图刷新策略在SurfaceView中的实现方法。图6-7 执行效果再看背景会在背景图和黑色背景之间来回闪的问题,这个问题其实是源于SurfaceView的双缓冲机制,也就是说它会缓冲前两帧的图像并交替传递给后面的帧用作覆盖,这样由于仅在第一帧绘制了背景,第二帧就是无背景状态了,且通过双缓冲机制一直保持下来。

SurfaceView绘图:覆盖刷新与脏矩形优化

脏矩形是指每次都重绘整个背景图,这是非常浪费的,前后两帧的图其实只有很少的一部发生了变化,因此可以只重绘变化的部分。这是一种常用的绘图优化方式,需要注意的是,Android用了双缓冲,也就是说当使用脏矩形的时候,需要连续绘制两次才能完成对surface的刷新。

SurfaceView在Android中用作游戏开发是最适宜的,本文就将演示游戏开发中常用的两种绘图刷新策略在SurfaceView中的实现方法。

首先我们来看一下本例需要用到的两个素材图片,分别如图6-3和图6-4所示。

978-7-111-51616-3-Part02-355.jpg

图6-3 渐变图

978-7-111-51616-3-Part02-356.jpg

图6-4 半透明的图像

图6-3是一个渐变图,作为背景图片。图6-4是一个半透明的图像,我们希望将它放在上面,围绕其圆心不断旋转。请读者先看如下的代码:

978-7-111-51616-3-Part02-357.jpg

978-7-111-51616-3-Part02-358.jpg

978-7-111-51616-3-Part02-359.jpg

执行后的效果如图6-5所示。

978-7-111-51616-3-Part02-360.jpg

图6-5 执行效果

上述代码的运行效果符合我们的要求,但是有一个问题:在代码中设置的帧频最大值是每秒30帧,而实际运行时的帧频根据目测就能看出是到不了30帧的,这是因为程序在每一帧都要对整个画面进行重绘,过多的时间被用作绘图处理,所以难以达到最大帧频。

(1)脏矩形刷新

接下来我们将采取脏矩形刷新的方法来优化性能,所谓脏矩形刷新,意为仅刷新有新变化的部分所在的矩形区域,而其他部分不去刷新,以此来减少资源浪费。我们可以通过在获取Canvas画布时,为其指派一个参数来声明我们需要画哪个局部,这样就可以只获得这个部分的控制权。例如下面的演示代码:

978-7-111-51616-3-Part02-361.jpg(www.daowen.com)

为了便于观察,此处将矩形区域设定为问号图形区域的1/4,也就是说在整个画面中我们仅仅更新问号图形的1/4大小区域。执行后的效果如图6-6所示。

此时可以看到,仅有1/4区域刷新。现在的刷新帧频已经能达到最大帧频,这是因为优化起作用了。但是实际上如果把刷新区域扩大到整个问号图形所在的矩形区域的,会发现优化作用变得微乎其微,不能达到最大帧频,因为更新区域增大了3倍,带来的资源消耗也就大幅提高。

978-7-111-51616-3-Part02-362.jpg

图6-6 有残影

(2)覆盖刷新

在上一种方式的处理结果下,接下来考虑结合覆盖刷新方法进一步优化。每次刷新时最大的消耗在背景图绘制上,这个绘制区域非常大,会消耗很多资源,但实际上背景图在这个例子中是从不变化的,也就是说我们浪费了很多资源在无用的地方。那么是否可以只绘制一次背景,以后每次都只绘制变化的问号图形呢?答案是肯定的。修改代码,在代码前添加一个帧计数器,然后我们仅在第一帧的时候绘制背景:

978-7-111-51616-3-Part02-363.jpg

978-7-111-51616-3-Part02-364.jpg

此时直接运行后的效果如图6-7所示,这时会发现问号图案会变得有残影了。这正是我们使用半透明图案做范例的目的,通过这个重影可以看出,覆盖刷新其实就是将新的图形绘制到上一帧,所以如果图像是半透明的,就要考虑重复叠加导致的问题了,而如果是完全不透明的图形则不会有任何问题。

978-7-111-51616-3-Part02-365.jpg

图6-7 执行效果

再看背景会在背景图和黑色背景之间来回闪的问题,这个问题其实是源于SurfaceView的双缓冲机制,也就是说它会缓冲前两帧的图像并交替传递给后面的帧用作覆盖,这样由于仅在第一帧绘制了背景,第二帧就是无背景状态了,且通过双缓冲机制一直保持下来。解决办法就是在前两帧都进行背景绘制:

978-7-111-51616-3-Part02-366.jpg

此时执行后就没有问题了,如图6-8所示。

978-7-111-51616-3-Part02-367.jpg

图6-8 执行效果

虽然此时还是达不到最大帧频,但是在真机上跑的会更快些,已经接近最大帧频了。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈