游戏画面很棒,可玩性也不错,但是这时却发现大部分机器跑起来都不到30帧。相信很多公司都遇到过这种尴尬的情景。偶的上家公司很大程度上就是死在性能上。那么既然优化这么重要,为什么不一开始就重视起来呢。哈哈,不是不重视,原因有很多种,下面列举一些:
1、由于进度鸭梨太大,程序们来睡觉的时间都没有,优化见鬼去吧,先把功能实现吧。
2、美术与程序的较力,美术经常在不知不觉中添加N个能突出场景画面的粒子特效等程序无法忍受的东东。
3、引擎本身的承载鸭梨不够。
相信很多人都遇到过上面的情况。引擎架构就这样,时间就几个月,美术就这水平,策划就是这样要求。请问各位看官,这时老大把你叫到小黑屋跟你说“这次测试后,反响不错,也发现咱们游戏现在的命门就是性能,不过我相信你的能力,你有信心在1个月搞定吗?”,相信各位都会跟我一样,咬咬牙,坚定的回答“没问题”,(鬼知道是否会不会搞的定),没办法,只能硬着头皮优化了。下面我给大家提供的方法,能用的用,不能用的欢迎拍砖。
1、针对明显的性能瓶颈进行重点突破,这个花的时间会最多,但是成效会最明显。我们的瓶颈就是地表渲染,我重写后能提高1/4的性能;
2、整理感觉有问题的代码,通常一定会有问题,也会有意想不到的收获。
3、开启NV pref,分析是CPU瓶颈还是GPU瓶颈(一般都是CPU的问题)。
4、语法级别的优化。
5、针对不同级别的显卡指定不同的策略。
下面我针对3提到的CPU瓶颈和GPU瓶颈进行重点分析:
CPU瓶颈几乎是100%会遇到的。可以使用 Intel 的 vTune (30天免费),或 AMD 的 CodeAnalysis(免费) 来分析具体哪些函数调用耗时,列出来一个优先级列表,然后一一搞定。
下面列为我们游戏当时的前几位的瓶颈:
1、地表渲染(CPU部分);
重写地表渲染算法,重点在于减少dp和pass数目;
2、骨骼动画(CPU计算);
把骨骼动画的计算改在VS中计算;
3、倒影;
针对性地减小倒影范围;
4、memcpy;
寻求快速内存拷贝算法;
5、sqrt;
寻求更快的开平发算法。例,卡马克算法;
6、场景管理;
实现四叉树管理;
GPU瓶颈,重点就是优化shader,尽量不要使用分支语法。
目前提到的都是在游戏开发后期的优化,虽然感觉挺简单的,但的确能起到一定的作用,不至于使游戏因为性能夭折。
但是敝人认为,上医治未病,如果我们能在开发早期就指定一个优化方案,那将会事半功倍。
可以分以下几个部分来制定:
1、引擎架构层的优化。前提是自己写引擎,或对引擎有超强的控制力。这部分可以参考NV的优化策略,及zbufferoptimizations和Real-Time Rending Pipeline Optimization等相关文章。
2、指定严格的代码规范,尽量避免性能差的代码;
3、指定美术模型标准,每个模型的面数范围,及同屏的面数范围;
4、针对不同配置的机器,提前设计不同的显示策略;