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



         用过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人左右




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值