您的位置 首页 java

Java中告别动画空白帧闪烁-双缓冲

“只见那翩翩公子握剑之手高高举起,一时间,众人眼前白光一闪,纵然目力最为深厚之人也无法再看到任何事物,白光过后,长剑已然打在对手脖颈之上…………”。好吧,必须承认这只是小众低质武侠玄幻之类网络快餐小说常用桥段,作为小说而言,可能读者看到这一段不会觉得有何不妥,但是如果这个场景被一些不合理的程序实现方式不小心作为附赠品带到了我们的游戏中,玩家可能就会被高频的“白光一闪”亮瞎钛合金X眼……………………

什么是高频“白光一闪”呢?

就是我们游戏画面有任何动画展现时,动画不连贯,就如上述文字片段所述,本应该非常流畅的长剑斜劈动作在每一次帧切换时都有空白帧乱入,导致角色呈现出现-空白-下一帧-空白-下一帧的白帧频闪现象。

导致这种现象有两个罪魁祸首:画布清屏和设备性能低下。

绘画类操作有一个特点,绝大部分画布组件不会主动清除已经绘制的历史图案,也就是说如果不做特殊处理,我们间歇性改变屏幕中一个小点的坐标并重绘,希望看到小点运动的动画,结果却能看到小点在屏幕上运动的历史轨迹。介于此,在绘制新帧之前,我们需要使用一种特定的前景色填充一个足够大的矩形(一般和画布保持一致)使用覆盖的方式来主动清除历史图案。然而这种方式结合复杂的场景和角色数据加上性能低下的设备就会带来“白光”频闪的风险。

在所有的绘制操作中,直接绘制几何图形和重复绘制复杂图像所需要消耗的性能完全不在一个数量级上,目前的各类设备中绘制几何图形所消耗的事件均可忽略不计,而会进行大量重复图像绘制操作的场景、角色渲染将可能会带来较长的延迟,这就导致了清屏之后屏幕上会存在一定时间的空白期,根据实现动画的视觉暂留现象原理,如果这个空白期时间足够长,那么它将被我们的视觉神经当作动画的一个帧存在,这也就导致了悲催的频闪出现。

要想杜绝这个现象,那么我们就不能采取清屏操作,在必须清除画布上原有图案的条件约束下,使用“双缓冲”就是必要的手断了。所谓双缓冲其实很容易理解,那就是预先在内存中创建一个足够大(一般为画布大小)的不透明缓冲图片,每次先清空该图片内容,然后将当前帧的下一帧画面预先绘制在这张图片中,当画面帧所有的绘制操作完成之后,一次性将缓冲图像绘制在画布上。这样即时不清屏也能覆盖掉上一帧的全部内容,而没有空白帧的出现,也就不会导致频闪现象的发生了。

JavaSE 中,缓冲图像可以使用创建BufferedImage对象,Android中临时创建的空 Bitmap 对象能够担任此类角色。

文章来源:智云一二三科技

文章标题:Java中告别动画空白帧闪烁-双缓冲

文章地址:https://www.zhihuclub.com/178846.shtml

关于作者: 智云科技

热门文章

网站地图