游戏优化,在开发中经常分为这几步:
- 首先确定游戏中经常会出现哪些问题—Profile
- 然后确定在哪些方向进行性能优化—Analyze
- 最后再尽可能将问题逐个解决—Solve
游戏开发中一定要先做工具,进行Profile,在进行优化。常见的工具是一些引擎和IDE自带的,比如Unity自带的Profiler,就包含了CPU,GPU,Memory等等各式各样的性能分析工具,其他的比如GPA,Xcode Instrument和Visual Studio,Intel自带的内存管理工具在必要的时候也使需要去学习和使用的。
另外一些工具,就需要根据游戏的需求去编写了,比如一键关闭所有特效,一键更改分辨率等等,一键设置场上NPC数量,简单的游戏如啪啪三国是做成快捷键开启Profile功能的,更为复杂的游戏如神秘海域则是通过游戏内控制台来进行更为细致的Profie。
接着,我们来说说游戏优化中主要的四个方向考虑:
1、CPU
引发的问题:
- 由于短时间内计算量太大,导致画面流畅性降低,俗称跳帧;
- 发热严重,耗电量高;
常见优化手段:
- 将计算分到多个逻辑帧中进行计算,避免短时间内的性能超过负荷,俗称“分帧”;
- 将可以缓存的数据尽可能的缓存起来,避免重复计算和重复分配内存,常见的示例为“内存池”;
- 使用合理的数据结构和算法,比如:冒泡排序和直接插入排序在整体数组比较有序的情况下效率大大好于快速排序。把快排替换成是优化程序排序效率的一个常见的思路。
2、GPU
引发的问题:
- 发热严重,耗电量高;
- FPS降低;
常见优化手段:
- 优化美术资源,比如合理规划图集;
- 尽量减少DrawCall(openGL的描绘次数);
3、IO和网络
引发的问题:
- 网络延迟甚至掉线;
- 加载资源导致的跳帧;
- 加载时间过长;
常见优化手段:
- 使用独立的线程进行加载;
- 减少网络包里的冗余数据;
- 合并小包,减少请求数据的次数;
- 分帧对回报进行处理;
- 限制一定时间内的发包频率;
4、内存
引发的问题:
- 闪退或卡死,比如安卓的Low Memory Killer会在低内存情况下杀掉内存占用过大的程序;
常见优化手段:
- 动态加载和释放资源,比如在游戏内的时候,我们可以把游戏外的一些UI图集卸载掉;
- 降低资源质量或屏幕分辨率,这是有损优化,一般作为最后的手段;