写点什么

游戏夜读 | 如何优化缓冲加载?

用户头像
game1night
关注
发布于: 2020 年 05 月 13 日

游戏画面元素丰富,则容易屏幕闪烁。这种现象的原因是负责在屏幕上画画的函数动作太慢。而这种现象之所以被发现,主要是三个方面的因素。第一,是因为人类肉眼有“视觉残留”,残留的时间约是零点一秒,换句话说,一秒钟至少播放十张图片,这样人类看起来是“动画片”,这样屏幕就不会闪烁。实际上,现在每秒钟在屏幕上的动画次数都大于十次。第二,是因为除了有内容的图像之外,一般还有纯黑的画面,进行交替播放,以此来模拟实现物体的位移,而纯黑的画面比较容易,有内容的图像处理起来麻烦一些,如果计算机反应慢,就会慢一拍,最后效果变成一种闪烁。第三,是因为画面张数越多,表现得效果就越细腻,尤其是微观物体放大的画面、快速运动的近景等,而这又加重了计算负担。



为了保证播放效果的流畅度,程序家发明了缓冲、缓冲加载、渲染等分步骤的屏幕图像显示方法。其中的“缓冲加载”涉及比较关键的前后屏算法技术。当然,这些起初只针对大型、复杂、丰富的场面,尤其是对品质要求高的场景。



缓冲加载的方针主要是“尽量减少前屏绘制的工作量”,思路的重点是“选区”,更具体的说是“块移图面”,英文称为“blit surface”,这里简称为“位移”。位移(blit)大体上分有三类。



第一类是“全屏加载”。全屏的做法虽然简单粗暴,但不一定效果最差,尤其是屏幕的大部分位置都需要更新的情况下,采用全屏绘制,与理论最优的区域差距并不会很大,却能省去不少脑细胞。



第二类是“脏脏块的合并与切割”。脏脏块这个词,是仿照脏脏包而来的,一般的英文是:dirty rectangle,与脏数据的“脏”用意差不多,意思不相同。脏数据是要被清洗掉的数据,脏脏块则是游戏世界里的变动,是那些需要在前屏重新绘制的区域,对于前屏来说,脏脏块是要被重新粉刷的区域。之所以把区域用块状去选择,这只是目前大多数游戏引擎或代码中的手段,可能是长方形比较好定义:长、宽。所以这一类方法的核心不在于矩形区域,而在于基于矩形的一些合并、切割,试图在全屏的全集中找到一个或数个子集,然后对这些子集进行重绘,重绘的面积就相对小很多,特别适用于那些每次只更新特定一些部分的游戏画面。



第三类是“泥瓦工和脏脏标签”。泥瓦工的意思就是,先把全屏人为分成几个瓦片,然后每次就检测这几个部分中的哪些需要被重绘,可以说是用户界面设计师(UI)的好朋友。脏脏标签也是同样的思路,只是这次的瓦片不是事先固定的,可以是动态变化的物体本身,这种方法直观上就比较适合游戏世界的物体比较有规则,尤其是平面2D的。



总的来说,缓冲加载到处都是优化问题。不过,有句话说的是:优化游戏代码可能会引来麻烦。虽然离屏缓冲、缓冲加载这两个部分跟核心的游戏逻辑已经相去甚远,但不可否认的他们也是一套游戏代码的一部分,还是要慎重。



文/良宵听雨。授权“游戏夜读”发表。



发布于: 2020 年 05 月 13 日阅读数: 45
用户头像

game1night

关注

烦请督促我的游戏功课喔! 2017.04.06 加入

计划坚持创作以“游戏夜读”为主题的短文,并以这些杂文作为连载公开发布。烦请大家一起督促我的游戏功课喔!欢迎关注和阅读,如有不足,可直接留言批评,会继续努力!

评论

发布
暂无评论
游戏夜读 | 如何优化缓冲加载?