40

Unity性能优化 – 设置篇

 4 years ago
source link: https://www.tuicool.com/articles/YnA7je
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

想要做好Unity性能优化,主要从CPU,内存,GPU等多方面进行,需要处理好许多事情。在脚本篇中我们就Unity API,C#,IL2CPP,Lua和算法数据结构等多方面提出了性能优化建议。鉴于Unity内设置项繁多,如果某项设置不当,就可能会对性能造成负面影响。

本文将从纹理、模型、音频等多方面进行讨论,主要针对影响性能较大的设置项。

纹理

EBRNbqa.png!web

  • Read/Write Enable :如果你不需要运行时读取图片的像素信息的话, 禁用 ,否则启用后纹理的内存消耗会增加一倍。
  • Generate Mip Maps :如果不是3D模型贴图,则 禁用 ,否则会多出约33%的内存开销。Mipmaps主要为远处的物件生成较为清晰的小贴图,减少渲染导致的画质损失。像UI贴图,则完全用不到。
  • Override for iOS/Android启用 ,为特定平台做差异化配置。
  • Max Size :视情况而定,默认最大贴图尺寸限制为2048,如果是特效贴图限制为512。
  • Format
  • iOS推荐使用ASTC,ASTC一般推荐 ASTC 6x6 ,如果清晰度达不到需求,可以设置为 ASTC 4x4 。注意:ASTC仅在iPhone 6以后的设备被支持,如果需要支持iPhone 6之前的设备,可以设置为 PVRTC
  • Android推荐使用ETC,如果是带透明通道的,可选择ETC2,注意:ETC2只在支持OpenGLES 3.0的设备获得支持,如果考虑旧设备,则可以选用ETC,然后勾选 Split Alpha Channel 。如果不带透明通道,则无脑选用ETC。
  • 我们可以在预览的下方看到纹理的压缩格式和实际占用的内存大小,我们需要经常关注这项信息,以观察设置是否生效。
  • ei2ARje.png!web

模型

eqEzQnn.png!web

  • Mesh Compression :压缩比越高模型文件越小,需要根据游戏内的实际效果决定,一般可以设置为 Medium
  • Read/Write Enable :如果你不需要运行时修改模型的话, 禁用 ,否则启用后模型的内存消耗会增加一倍。
  • Optimize Mesh :推荐启用,可以提升GPU性能。
  • Normals :如果你的模型没有法线信息,将其设为 None ,可以减小模型大小。

Rig

AjuqeaZ.png!web

  • Animation Type :如果你的模型没有骨骼,将其设为 None
  • Optimize Game Objects启用 ,可以将暴露在Hierarchy的子节点移除,极大的减少了模型的层级和Children数量,从而提升运行时性能。如果有挂载点需求,在 Extra Transforms to Expose 里添加需要暴露的子节点即可。

Animation

Nn67Fbj.png!web

  • Import Animation :如果你的模型没有动画,将其解除勾选。
  • Anim. Compression :推荐使用 Optimal ,经过测试 OptimalKeyframe Reduction 节省约50%的大小,从而可以提升加载速度。如果觉得动画质量太差,则可以退回到 Keyframe Reduction 甚至到 Off

Materials

NbAZFvE.png!web

如果你不需要模型内的材质,解除 Import Materials 的勾选,否则会附带一个默认的材质引用在模型里。

音频

音频的性能开销主要有两点:内存开销和CPU开销。 u2mqueB.jpg!web

关于内存开销,我们可以通过最下方信息里的 Imported Size 来得知。

音频设置中影响性能最大的两个参数为 Load TypeCompression Format

其中 Load Type 有三种类型:

Decompress On Load
Compressed In Memory
Streaming

Compression Format 主要也可以分为三种类型:

  • PCM :完全不压缩格式,占据的硬盘和内存相对会较大,由于运行时不需要解压,所以它的CPU开销最小。
  • ADPCM :一种古老的压缩格式,相对于 PCM 的压缩比为 3.5:1 ,但是运行时的解压开销很小,对于音质有一定损耗。
  • Vorbis/MP3 :常见的压缩格式,主流平台全部支持的格式,压缩比较高,但是运行时的解压缩开销较大,对于音质的损耗更加严重。在iOS平台上一般设置为 MP3 ,因为iOS支持 MP3 格式的硬解码。

那么对于音频文件我们应该如何设置?

我的建议是:

  • 对于背景音乐,采用 Compressed In Memory + Vorbis/MP3 ,因为背景音乐通常较大较长,所以内存开销就会比较大,这时候我们应该优先关注内存,同时也要使CPU开销没有 Streaming 那么大。
  • 对于时长较短且频繁播放的音效,比如按钮点击音效,采用 Decompress On Load + PCM ,因为非常短的音效文件很小,所以内存开销就不那么关键,可能由于要播放多次,这时候CPU开销就很关键。
  • 对于一般的音效,采用 Compressed In Memory + ADPCM ,你需要去试听其效果,如果觉得 ADPCM 失真太严重,可以将其换成 PCM

其他

Quality Settings

QFN77vA.png!web

  • Texture Quality :贴图质量,可以选择 Half Res ,这样速度会更快,但是贴图质量会轻微下降。
  • Shadows :建议禁用,Unity内的影子开销很大,可以用贴图来实现粗糙的阴影,也可以自己 用Shader实现 ,影子的模型可以利用减面工具来减面,譬如 Simpolygon
  • V Sync Count :建议设置为 Don't Sync ,否则无法自行在游戏内控制帧率。有些时候在静态UI较多的界面,可以将帧率适当降低,以达到减少发热量和耗电量的目的。
  • Async Upload :建议在Loading时,将 Async Upload Time Slice 调大成4ms或者8ms,将 Async Upload Buffer Size 调高到16MB,以加速资源上传。具体可以参考: 优化加载性能:了解异步上传管线AUP

Player Settings

BzuURn2.png!web

  • Scripting Backend :选 IL2CPP ,IL2CPP经过几年的不断完善,已经非常稳定,转成C++代码后性能得到提升,同时也变相提供了对C#代码的混淆。
  • C++ Compiler Configuration :默认选择 Release ,如果出上线包的话,推荐改成 Master ,这样虽然打包速度会慢一点,但是编译的C++代码会更加优化一些。

3yem63Y.png!web

  • Prebake Collision Meshes启用 ,用构建的时间换运行时的性能。
  • Keep Loaded Shaders Alive启用 ,因为Shader的加载和解析很耗时,所以不希望Shader被卸载。
  • Managed Stripping Level :如果项目比较简单,可以尝试 High ,这样可以降低一些包大小。如果项目比较庞大,则需要酌情考虑,因为 HighMedium 可能会导致报错或者闪退。
  • Optimaze Mesh Data启用 ,减少不必要的Mesh数据,降低包大小。

JfYfy27.png!web * 安卓有个 Blit Type 的选项,如果你的 Color Space 不是 Linear (Linear空间会比Gamma空间开销更大,但是显示效果更好),则可以将其设为 Never ,这样可以 减少额外的一次Blit而提升性能

参考资料


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK