再聊md5骨骼动画

再聊md5骨骼动画

      距上次发博客已经有好几年了,一直在瞎忙.最近一直在研究性能的东西,所以总结一下,我也没有彻底做完,边写边研究.

      骨骼动画原理之类的东西网上资料特别多,但是大多数是研究怎么正常解析出来,关于性能方面的东西说的比较少.或许这块一的提升并不是很大吧,不过谁叫咱flash性能这么差呢,要优化到每条语句才行.

      先说一下md5骨骼动画的文件,md5骨骼的结构是一个树形,根节点到子节点.从建模软件导出时.写入的数据是局部信息(两个四元数),所以在显示的时候,咱们需要的是一个骨骼的全局矩阵,这里需要那两个四元数转换成矩阵,如果要得到一个子节点骨骼的矩阵,根据层次的复杂度,矩阵要计算N-1次的乘法,才能得到子节点骨骼的矩阵.通常我们是从根节点开始一次性计算完成.这一步的消耗也是非常大的,像在flash中,不使用多线程的话,占用主线程消耗时间太久的话,游戏就会明显的卡段了.所以刚开始就考虑能否将骨骼的矩阵使用全局矩阵,这样在加载完成时就不需要遍历做矩阵乘法.

      在转换完所有文件的时候,又发现新的问题,文件大小比原来的文件大了0.5-1倍,想了很久才搞明白,因为md5有一个标志位用来标志骨骼中有哪些数据修改,三个旋转和位移,共六个.如果整个动画没有修改的话,只会保存在基础帧中.而这个修改指的是相对矩阵,并不是全局矩阵,所以在变成全局矩阵的话,已经没有基础帧,等于没有了可压缩保存的空间.搞明白这个东西,就要进行权衡了.网络加载量和计算量,只能取一.

      在说一下渲染,一般引擎,在显示动画的时候,通常会取两帧根据时间进行插值,如果咱们是按30帧每秒导出的话这个插值,可以不做,直接取相近的帧,这个显示差别几乎看不出来.如果是帧数更少的话,插值就必要了,优点是文件更小,但动画帧的取值就复杂了.

      如果是使用全局矩阵的话,通过四元数得到矩阵这一步,可以在渲染到哪一帧时候在计算,这样就不需要在解析完后把矩阵全部转换出来.咋优化的目标主要就是将各种大循环拆分出来.修改后的性能提升在下一篇中再讲.