iii.上面的转置其实可以通过shader调整左乘右乘调整,但会增加一个Vector4,加上开销较小,就不做这个处理了。 iv.实际的测试模型,有100+根骨骼,这Shader目前只支持最大64根,C#端做了拆分处理(代码很长,不贴了)。 v.性能测试 PC上,30个人渲2遍,增加了9.3ms的GPUSkinRender.LateUpdate开销,BonePalette通过BakeMesh的计算就在这里(理应快很多,因为BakeMesh做了些额外的事情)。如果是直接bones[j].localToWorldMatrix * bindPoses[j];会是15.0ms左右。这一段计算合理的话应该在Worker线程完成的,但在C#层面无法修改或者得不偿失(可以自己用额外的分线程去计算,但是Transform需要提前Copy,按以往经验,快不了多少). PC上的同样的角色做CPU Skinning,Worker线程计算MeshSkinning.Skin非常快,主线程的overhead几乎可以忽略,性能上完胜. 5.结论 Unity CPU Skinning因为多线程与SIMD优化,性能非常好,在目前多核CPU时代非常有优势。在PC上,UnityGPU Skinning亦有更好的性能,实测下来是目前最优方案,也确实看到有游戏使用了(PC端的女仆2)。在Unity上实现的传统GPU Skinning,通过C#层面的优化,综合性能并不理想,主要原因是Unity的限制导致Bone Palette无法高效的多线程计算。但理论上,在GPU有余力时,Bone Palette如果能高效多线程计算,性能应该会上升.后续我会尝试在Unity源码层面做一些修改,希望能取得更优的移动平台性能。 原文链接:?ADTAG=gad.tg.sh (责任编辑:本港台直播) |