Wakeari(有诡)中有一个有趣的渲染模式——念摄模式。但在该模式下帧率暴跌。于是我对其进行了分析。
非念摄模式下有60帧——
念摄模式下仅有14帧——
60变为14,帧率暴跌至原来的1/4左右。
技术分析
估计该游戏采取的是“渲染两次”方案。具体步骤为——
1.根据鼠标拖动的区域,生成一张掩码位图(念摄区域图);
2.将外衣的模型标记为可见,渲染场景,输出到纹理A;
3.将外衣的模型标记为隐藏,渲染场景,输出到纹理B;
4.根据掩码位图,合并纹理A 和 纹理B,然后输出到屏幕。
该方案有两个缺点——
1.第2步、第3步共渲染两次,使帧率下降一半。
2.在第4步合并纹理图时,需等待第2步、第3步的渲染操作彻底完成后才能执行。堵塞了渲染流水线,严重影响帧率。
优化方案
“渲染两次”方案真的太渣了。在DirectX 9.0c下明明可以很简单就能渲染出类似的效果,只需要渲染一次。具体步骤为——
1.根据鼠标拖动的区域,生成一张掩码位图,并将其作为纹理(念摄区域纹理图);
2.其他模型仍然按老方式渲染,仅需要修改外衣渲染的像素着色器代码——将当前像素坐标变换到屏幕坐标,根据屏幕坐标查询念摄区域纹理图,若在区域外直接返回透明颜色,若在区域内就按老方法进行渲染。
仅增加了3条指令。将当前像素坐标变换到屏幕坐标只需要一次矩阵乘法就行了,而且查询纹理图也是速度很快的操作,最后再多一条条件跳转指令。增加的开销微乎其微,理论上能达到与非念摄模式下一样的帧率。
(完)