# 骨骼动画性能优化指引
尽管在小游戏框架中,基于客户端加速的实现使得骨骼动画性能达到原生水平,但在实际游戏开发过程中,场上同时存在过多的骨骼动画对于性能是非常大的消耗。本章将介绍一些方法帮助开发者进行骨骼动画的性能优化。
# 避免在场景上展开完整骨架
某些第三方游戏引擎的实现中,骨架节点是作为场景上的节点存在的。为了让第三方引擎的游戏资源快速导入小游戏框架,动画系统支持了在场景上展开完整骨架
的模式
在场景上不展开完整骨架的优势包括:
- 充分利用多线程加速
- 减少业务不关心的节点的开销,
- 加快节点创建及绑定的速度
如果模型来自于fbx导入,则在场景上展开完整骨架
模式默认关闭
如果模型来自于Unity导入,请确保在ImportSetting
中打开模型的optimize
选项
# 渐进式加载AnimatorController
随着游戏规模的增大,角色的AnimatorController
可能会越来越复杂,同时包含越来越多的AnimationClip
。然而小游戏的资源大多是网络加载,AnimationClip
过多可能造成主角的加载速度变慢,影响用户体验。
一种可以参考的实践是,为主角额外创建一个基础Controller,包含了基本动作:站立、移动等基本的Clip。主角的Prefab中,绑定这个基础Controller。而完整的Controller在游戏过程中静默加载,加载完成后替换animator组件上的基础Controller。示例如下
// charEntity is the root entity of character
const animator: engine.Animator = charEntity.getComponent(engine.Animator);
engine.loader.load("fullController.animatorcontroller").promise.then((fullCtl: engine.AnimatorController)=>{
// when full controller is loaded, replace the base controller
animator.controller = fullCtl;
}).catch((e)=>{
// log the error
console.error('load character full controller fail',e);
})
# 合理使用GPU烘焙动画
在游戏中处理GPU烘焙动画可以极限减少CPU开销。在GPU烘焙模式下,动画每帧的开销仅为计算当前播放的帧数(frameIndex)。
关于如何使用GPU烘焙动画,请参考GPU烘焙动画章节
但如果游戏的帧率瓶颈是GPU,使用GPU烘焙动画反而会造成帧率降低。开发者可使用例如perfdog、SnapdragonProfiler等第三方工具对游戏性能进行分析。