MMR中用到的游戏性能优化方法

来源:互联网 发布:mac词典发音 编辑:程序博客网 时间:2024/04/30 06:05

我一直觉得游戏的优化工作不要等到最后再做,应该在Milestone的中途专门安排时间做,周期性,持续性不断的改进,最后游戏才会具有很好的兼容性和性能。兼容性的测试可以比优化工作的周期长一些,比如两个Milestone做一次。如果在要发布前安排做优化,有可能优化的代码重构会引会结构很大的改变,进而引发更多bug;还可能没时间做,最后放弃优化,游戏质量很差。

游戏的优化不能拍脑袋做,一定要在分析Profile的基础上做,MMR游戏自带一个简单的CPU时间统计功能,我们也用到Vtune,非常强大的工具,可以具体到哪些函数最费,GPU方面我们用的是PIX,专门测试NVidia,可以用NVPerfHUD与NVShaderPerf,专门测试ATI,可以用RadeoPro。如果是OpenGL的话,可以用GDebugger,也可以自己统计GPU的时间。

工具测试后,就要从从瓶颈入手,首先要确定是CPU还是GPU是瓶颈,CPU的瓶颈是因为等GPU引起的还是自身就费,GPU瓶颈一般都是像素着色器引起的。

MMR后来升级到了DirectX9,这里就总结一下,MMR游戏用到的优化方法。

CPU优化

1.动画蒙皮

一般游戏都有这个问题,因为角色的网格片面过多,在CPU做蒙皮常常非常费,而浮点计算是GPU的强项,因此我们将Skinning的计算放在GPU中去计算,将骨骼的动画信息和网格权重传入GPU,虽然数量大,但速度非常快,而且推荐一点在开发时定好资源的约束,比如骨骼数不超过32/per skeleton,面片最大数多少,贴图用多少等等,都要跟美术一起商量定好。网上很多具体方法,就不在儿重复了。

2.粒子系统更新

这是通过Vtune工具检查出来的,特效美术因为之前没有太考虑性能,用了非常多的曲线,像什么Bezier,每帧都要计算(一定要时刻关注美术啊!),其实曲线的计算也有很多优化方法,比如关键点存下来,能用单次曲线就不要用二次曲线(肉眼也感觉不到太多差别)。这里面方法就多了。

3.粒子系统渲染

粒子系统做的不好,渲染会消耗非常多的drawcall,每个drawcall都要设置状态,传值,可想而知,是个具大的可以压缩的气球,我们将具有相同渲染状态的粒子做了Batch,合成一个vertex buffer传到gpu渲染,几乎可以做到一个粒子发射器一个buffer,一个draw call,节约了不少时间。

4.Clip system

裁剪模块也是非常费的,因为MMR用的是Tile,因此我们做了专门的优化,在图形系统做clip时,只会对角色所在的tile和附近的8个tile作cliping,场景大的话,这种优化效率非常明显,如果有场景管理系统的游戏,应该根据不同的应用使用不用的优化方法。

GPU优化

1.Deferring rendering

一般的游戏现在都会这样做吧,延迟渲染有很多好处,支持无限多个灯光,支持贴花,支持投影点,虽然Render Target会创建很多个,但一定要将buffer的通道都用上,物尽其用嘛。游戏上了一定的规律,这个是必不可少的。

2.Multi-threading compile shader

OpenGL好像没有这个问题,HLSL的编译会花几百ms时间,帧率会抖动,经过排查,终于找到了是shader编译的问题。我们就创建了另一个线程专门负责编译shader,渲染管线也不用等待,shader没好,就不渲染,其实十几帧,用户也不太会发现。其实游戏中很多模块简单独立的,都可以取出来用多线程做,比如动画更新,渲染模块。

3.Shader cache

编译好的shader要做cache存起来,上一帧传入gpu的变量值也缓存起来,如果相同就不用再设置一次,尽量减少dx的值传递。

4.Pixel Shader

像素着色器99.9%都是最费的,因为技术美术喜欢直接操作像素的颜色,一定要和他一起检查shader代码,如果技术美术不是程序员出身的话,可能会重复计算,可能会把明明vertex shader可以做的工作,拿到pixel shader来做,可能有些无用的低效的计算,都是要检查,清除的。


原创粉丝点击