Away3d ---------------------------------------------骨骼动画优化

来源:互联网 发布:s7300编程电缆 编辑:程序博客网 时间:2024/05/16 16:59


         用过Away3D的朋友估计都会发现,在Away3D里面使用超过一定骨骼数量的角色,当场景里面角色的数量稍微多一点,整个场景就会很卡。 对于这个现象,有两个层次的原因:1.Stage3D的VC缓存器数量的限制,造成了对需要占用VC的骨骼信息有限制。对于超过了限制数量的骨骼部分,Stage3D会把数据退回CPU计算。

     

       一方面 通过对AnimationSetBase.cancelGPUCompatibility断点,发现了在SkeletonAnimator.testgpUCompatibility方法里面有检查是否需要退回CPU的判断。其判断的条件是:

if (!_useCondensedIndices && (_forceCPU || _jointsPerVertex > 4 || pass.numUsedVertexConstants + _numJoints * 3 > 128)) 

可以看出:

除了_useCondensedIndices ==false,还需要

1._forceCPU == true

2.一个顶点受到大于4个骨骼的影响。

因为每个va只能存xyzw四个数,按照Away3D的顶点着色器的处理,就只能最多一个顶点受到4根骨骼的影响。

3.已经使用的Vc,加上骨骼占用的VC,要少于128个。

由于Away对于骨骼 Transform推入GPU的计算是三个基向量,也就是占用3个缓存器,所以需要 骨骼数*3

因此为了避免骨骼动画由GPU计算被退回到CPU计算应该对最大骨骼数量及每个定点收到的骨骼影响数做限制,当骨骼数不够用时(例如为了实现较为复杂的动作效果所需骨骼数较多时 可对模型进行拆分保证每次渲染不被退回CPU计算)

   

   另一方面 由于毎帧CPU都会计算每个动作所处的关键帧 权重值并根据这些数据重新计算 每根骨骼的矩阵信息并传给GPU做蒙皮,因此此处CPU计算仍然会是一个性能的重要影响。此处可优化的方向有两个: 1. 由于骨骼动画中经常使用的是相对父骨骼的位置旋转信息,基本不会对骨骼进行缩放,因此可将向GPU传入两个四元数(或者两个向量)代替传输矩阵,减少CPU GPU传输数据的总线带宽。  2. 对关键帧信息预计算并保存到内存,毎帧直接从内存中取得当前帧对应的关键帧信息,避免毎帧的CPU计算。


经过以上方面的优化,本人经历的项目中同屏人数可由140人增加190~200人左右




0 0
原创粉丝点击