Unity优化技巧(上)
本文首发于知乎专栏:MACK的游戏开发笔记,欢迎各位关注。
什么是优化
- 为了达成相同目标,寻求并采用消耗更少资源的办法的过程
对游戏来说通过特别的技巧,在实现相同的表现效果、流畅度的前提下对硬件机能的需求更低、更平民化。或者在相同性能的平台上,实现更好的画面表现效果、流畅度。
是追求极致。
- 包括CPU,GPU,内存,闪存,网络等
一般来说优化主要针对硬件因此分类也和硬件相关。此外优化也和职责相关,程序需要对代码优化,美术需要对资源优化,策划也需提供一些策划上的方案避免性能开销。
- 一个永恒不变的话题
人的欲望是无止境的,玩家的需求和项目的需求永远在不断增长。优化永无止境。
优化方法
- 根据性能指标设定优化目标
没有目标就没有方向我们首先就是设立优化目标,这也是一种通用的优化方式。不仅仅针对Unity。
一般游戏的性能指标有:帧率,稳定性(卡顿),等待时间(Loading),内存占用(手机上最重要指标,绝大部分闪退的原因,理想值是内存占用低于150M),安装包大小,网络延迟,网络流量,耗电量(手机比较重要,限帧)等等。
例如可以订我们的目标是在低配机型红米上可以稳定30帧运行内存200M以内,在中配机型上稳定在45帧运行实现主流游戏效果内存300M以内,高配机型上60帧稳定运行实现次世代效果内存。
- 根据性能指标设定优化目标
一般来说游戏优化也遵循28原则,游戏优化又是很费时费力的一件事,我们需要找出性能瓶颈。按照优先级来进行优化。
望闻:根据优化目标,先大概分析一下性能指标。包括帧数多少,是否稳定,是否存在卡顿。较长时间运行,发热量如何,是否存在闪退。安装包多大。网络流量多大等。找到最优先需要解决的点。
问:询问相关开发人员性能热点大概从什么时候开始出现。我们之前的项目在开发到中后期会找测试同学测试每日构建的版本,及时监控性能指标,第一时间发现性能瓶颈,发现越早越容易优化。
切:通过一些工具分析来进行深度的分析,必要时需要自己开发分析工具,定位热点。
- 优化性能热点
找到性能热点指点之后工作就已经完成一大半了,然后针对热点指定方案优化。下面先介绍一些常用的分析工具。
优化工具
- Unity Profile
最常用的性能分析工具,官方自带可编辑器可连真机,不做过多介绍。
- Xcode
苹果的性能分析工具,在IOS平台上是最好的选择。
- UWA
有本地工具(详见使用使用UWA
GOT优化Unity性能和内存)和在线版。它通过自动化工具收集Unity
Profile的数据,并结合人工进行测试分析。可以提供一些采集分析过的性能数据和优化建议。
- ADB & AndroidStudio
有时也会在Android设备上直接查看性能数据,日志等。
- Unity Frame Debugger
Unity自带的图形调试工具。功能相对较弱,不过因为集成在了Unity中,使用方便。
- Xcode GPU Frame Caputre
苹果平台下图形调试最好的选择。
- Adreno Profiler
高通的GPU调试工具。使用Mono开发,特别介绍一下,这是唯一可以比较方便导出渲染资源的工具,可以在不破解的情况下扒取游戏贴图,模型,Shader等资源。不过导出的资源会丢失一些信息需要工具还原。提供记录渲染API和回放分析,小米2小米4都可以使用,需要安装AndroidSDK,使用Adb连接。
- GPA
Intel的开发工具,DX版本的工具就非常强大(详见使用英特尔GPA优化《轩辕传奇》游戏的性能),现在也有OpenGL版本,使用方法类似。和DX版本兼容性非常好一样,各种GPU的手机基本都可以使用,不过一些深层次的性能分析只有Intel自家芯片才支持。。
- NVIDIA Tegra Graphics Debugger
Nvidia公司的分析工具,前身是大名鼎鼎的PerfHud,代替了PerfHud
ES。功能强大使用方便,和PerfHud一样使用的时候不是抓一帧而是实时冻结手机上一帧的显示,支持实时修改Shader并在手机上显示最终效果。缺点是使用Tegra的设备比较少,小米3和小米平板。
- Memprofile
Unity官方出的内存分析插件。
- 其他
每个显卡厂商都有自己的分析工具:一般都是基于驱动层。另外开发过程中还会开发很多自己开发的性能分析工具和集成一些插件,例如BuildReport,WeTest
Cube,Emmagee等等。
- 最后使用这些工具能干什么
- 实时显示游戏运行时CPU,OpenGL
runtime以及GPU上的性能数据。同时支持多种3D流水线的override模式。 - 可以看到3D流水线的渲染过程,API的调用过程,Shader的源代码和指令个数,使用的贴图格式等信息,mesh信息
- 可以分析DC是否过多,渲染状态是否调用过多,是否可以合并或者排序,地形,场景,角色,UI,后期处理等占比来定位性能热点。
- 可以分析贴图是否过多过大,是否使用显卡支持的压缩格式
- Override模式下。Null Driver, Null
Hardware,看定位性能是否在GPU上。关闭渲染或者一些相关API来定位性能瓶颈。例如ps,1像素贴图等 - 可以看一些工具提供的Shader优化建议,也可以修改Shader实时发送到设备,既可以分析其他游戏shader也可以自己调试。
- 分类开关不同类型的对象定位性能瓶颈。监控内存,当前引用资源数据,网络延迟,内存池开销等
- 等等
未完待续...
下一篇: