【转】一种简单有效的3D模型的动画多线程方案
摘要
本文将介绍一种简单而有效的多线程方案,能加速大量的3D模型的动画渲染。此方案通过使用线程池、双缓冲、间隔更新等方法显著提升了骨骼动画的性能。尤其值得一提的是,此方案可以使基于CPU的骨骼动画在多核系统上获得与基于GPU动画接近的性能,从而在某些情况下可成为除基于GPU动画外的另一种良好选择。
介绍
在现代游戏中,动画扮演着重要的角色,它使3D模型看上去更加真实。骨骼动画可能是今天我们使用的最高级的实时动画技术之一。在这种技术中,定义模型外形的蒙皮通常被称为皮肤,而支撑皮肤的结构通常被称为骨骼,皮肤的形状和位置随着骨骼的变化而变化。由于这种技术的算法涉及大量的矩阵运算[1],因此骨骼动画的计算密集性相当高。而且,大型多人在线角色扮演游戏中通常有一些大的游戏场景,比如集市,战场,闹市区等。这些场景中有很多动态的3D模型。因此处理这些模型的骨骼动画将成为游戏中一个显著的性能瓶颈。
当前,已经有一些软硬件技术被用于优化骨骼动画的性能。比如对模型骨骼使用LOD(细节分层)技术能减少远处模型的动画复杂性。而在骨骼动画的算法实现中使用SSE指令能获得比原先C实现的代码至少高两倍的性能。对于支持顶点着色器(vertex shader)的显卡,大部分动画渲染工作能从CPU移到GPU上,并获得显著的性能提升。
在过去的几年里,PC业界有两种趋势,一种是越来越多的台式机和笔记本的处理器是多核的,这意味着现在开发的游戏将在一个主流为多核处理器的市场上发布;另一个趋势是笔记本市场的增长速度明显超过了台式机。这意味主要配备集成显卡的笔记本将在游戏玩家中越来越普遍。因此,如何合理利用多核系统的CPU和GPU资源将是游戏开发者需要认真考虑的问题。
本文提出了一种模型动画的多线程方案。此方案能通过利用多核处理器资源改善游戏的性能。此方案通过线程池、双缓冲和间隔更新的方法把骨骼动画的渲染管线并行化。而且,一个渲染大量动态3D模型的演示程序被开发用于验证此方案的有用性。测试表明此方案既有利于基于CPU的骨骼动画,又有利于基于GPU的骨骼动画,特别是对基于CPU的动画,通过使用这个方案,能使性能大大优于传统单线程的实现;并且,在某些高端显卡上,使用此方案的基于CPU的动画能体现了与基于GPU的动画近似的性能,而在主流的低端显卡上,更是显示了较明显的性能优势。
本文接下来的章节组织如下:第二部分介绍骨骼动画的技术和基于CPU和基于GPU实现的优缺点;第三部分阐述此方案及其实现细节,然后第四部分将介绍开发的演示程序,第五部分分析此方案的性能。第六部分提出了一些额外的考虑。最后第七部分是本文的总结。