【游戏优化】均衡好这四个方向
在游戏开发中,游戏优化通常会按照以下步骤进行:
- 确定问题(Profile):明确游戏中经常出现的问题。
- 分析方向(Analyze):确定需要在哪些方向进行性能优化。
- 解决问题(Solve):尽可能将问题逐个解决。
在游戏开发流程中,通常是先使用工具进行 Profile,再开展优化工作。因此,在讨论优化之前,有必要介绍一下 Profile 相关内容。
常见的 Profile 工具有两类。一类是引擎和 IDE 自带的工具,例如 Unity 自带的 Profiler,它涵盖了 CPU、GPU、Memory 等多种性能分析工具。此外,像 GPA、Xcode Instrument、Visual Studio 以及 Intel 自带的内存管理工具,在必要时也需要学习和使用。另一类工具则需要根据游戏的具体需求进行编写,比如一键关闭所有特效、一键更改分辨率、一键设置场上 NPC 数量等。简单的游戏(如《啪啪三国》)可以通过快捷键开启 Profile 功能,而更为复杂的游戏(如《神秘海域》)则通过游戏内控制台进行更细致的 Profile。
接下来,我们详细探讨游戏优化中主要的四个考虑方向。
1. CPU
引发的问题
- 画面跳帧:短时间内计算量过大,导致画面流畅性降低,俗称跳帧。
- 发热与高耗电:CPU 长时间高负荷运转,会导致设备发热严重,耗电量增加。
常见的优化手段
- 分帧计算(time - slice):将计算任务分散到多个逻辑帧中进行,避免短时间内 CPU 性能超过负荷。
- 数据缓存:尽可能将可以缓存的数据进行缓存,避免重复计算和重复分配内存,“内存池”就是常见的应用示例。
- 算法与数据结构优化:选择合理的算法和数据结构能够显著提高程序效率。例如,在整体数组比较有序的情况下,冒泡排序和直接插入排序的效率大大高于快速排序。将快速排序替换为其他合适的排序算法是优化程序排序效率的常见思路。
2. GPU
引发的问题
- 发热与高耗电:GPU 高负载工作会使设备发热严重,耗电量增大。
- FPS 降低:GPU 性能不足会导致游戏的帧率(FPS)下降,影响游戏体验。
常见的优化手段
- 美术资源优化:合理规划图集,约定模型的最大三角形面数,制定合理的粒子效果规范。这是游戏优化中非常重要的一环,技术美术在游戏开发中起着关键作用。
- 着色器优化:简化或者优化着色器(shader),减少 GPU 的计算负担。
- 减少 DrawCall:使用 Batching 技术,尽量减少 DrawCall 的数量,提高 GPU 的渲染效率。
- 使用平台推荐的压缩格式:不同平台有各自推荐的纹理压缩格式,如安卓平台的 ETC1 和 IOS 平台的 PVRTC,使用这些格式可以有效减少 GPU 的数据处理量。
3. 内存
引发的问题
- 闪退和卡死:当设备内存不足时,例如安卓的 Low Memory Killer 会杀掉内存占用过大的程序,导致游戏闪退或卡死。
常见的优化手段
- 动态加载和卸载资源:在游戏运行过程中,根据实际需求动态加载和卸载资源。例如,在游戏内时,可以卸载游戏外的一些 UI 图集。
- 降低资源质量或分辨率:这是一种有损优化手段,通常作为最后的选择。通过降低资源质量或屏幕分辨率,可以减少内存占用,但会影响游戏的视觉效果。
需要注意的是,这四个方面的优化相互制衡。例如,使用动态加载和卸载资源虽然可以减少内存占用量,但会导致 IO 加载时间延长。因此,在进行游戏优化时,不能追求绝对完美,而应遵循“Good Enough Is Fine”的原则,使这四个方面达到均衡。过度优化某一方面可能会引发其他方面的问题,有时反而不如不做优化。
4. IO 和网络
引发的问题
- 网络延迟与掉线:网络状况不佳会导致游戏出现延迟甚至掉线的情况。
- 加载跳帧:加载资源时可能会导致画面跳帧,影响游戏的流畅性。
- 加载时间过长:资源加载时间过长会降低玩家的游戏体验。
常见的优化手段
- 多线程加载:使用独立的线程进行资源加载,有些引擎(如 Unity)还可以利用协程来实现更高效的加载。
- 减少冗余数据:减少网络包里面的冗余数据,降低网络传输负担。
- 合并小包:将多个小的网络请求合并为一个大包,减少请求数据的次数。
- 分帧处理回包:分帧对网络回包进行处理,避免集中处理导致的性能波动。
- 限制发包频率:限制一定时间内的发包频率,避免网络拥塞。