大批量动画模型的优化

💡 原文中文,约2600字,阅读约需7分钟。
📝

内容提要

本文讨论了游戏性能优化的方法,包括预渲染图片和骨骼动画的使用,GPU中处理蒙皮的方法,渲染大量物体时的选择,以及Ant Engine中的新特性和处理动画帧号的技巧。

🔎

延伸解读

预渲染图片与骨骼动画的取舍

文章指出,预渲染图片本质是用空间换时间,将渲染过程烘焙到贴图,但图片比顶点数据消耗更大带宽,尤其使用帧动画时。骨骼动画则通过关键点压缩数据,减少每帧顶点状态。选择哪种方式需根据场景分析,不能一概而论。

GPU蒙皮计算的两种方案与风险

在GPU中计算蒙皮有两种选择:方案一每个物件跑完整流程,带宽小但计算量大,且因preZ、阴影等步骤导致重复计算;方案二分离蒙皮过程,需额外显存保存结果,手机上易显存不足。文章认为,对于僵尸潮场景,预计算所有动画帧的蒙皮结果更简单有效。

预计算蒙皮与instancing的实践效果

单个僵尸不到300个顶点,每秒30帧动画,预计算100秒动画数据手机显存可容纳。在CPU中烘焙好数据后,动画顶点可当作静态模型处理,结合instancing批量渲染上千僵尸。Ant Engine新增此特性后,实测iPhone 12可流畅渲染数千僵尸动画。

减少Lua调用开销的优化技巧

Ant Engine基于Lua,函数调用开销较大。为避免每帧数千次Lua调用修改每个僵尸的动画帧号,引擎内部只持有一个预渲染好的动画对象,每帧固定推进其offset,而每个对象保存起始相位值。在C层渲染时,将相位值与offset相加再对总帧数取模得到真实帧号,从而大幅减少上层调用。

❓

Q&A

如何通过预渲染图片来优化游戏性能?

预渲染图片可以提高渲染性能,但需根据具体场景分析,因为它消耗更大的带宽,尤其在使用帧动画时。

骨骼动画是如何实现数据压缩的?

骨骼动画通过关键点描述动画,只需用几十个关键点映射数千个顶点,从而实现数据压缩。

在渲染大量物体时,如何选择计算方案?

可以选择预计算数据或将计算放入GPU中,以提高性能,但每种选择都有其优缺点。

Ant Engine中新增的特性是什么?

Ant Engine中新增的特性可以流畅渲染数千僵尸动画,优化了性能。

在GPU中处理蒙皮的两种方案有什么区别?

方案一重复计算较多,带宽开销小;方案二需要额外显存保存蒙皮结果,可能导致显存不足。

如何减少每帧的Lua函数调用以提高性能?

通过固定推进动画对象的offset,避免每帧修改每个对象的动画帧号,从而减少Lua函数调用。

🏷️

标签

➡️

继续阅读