Unity 理解游戏优化
Unity 理解游戏优化
Unity优化的知识点很多,从美术资源、代码逻辑、框架设计等等。像我一样的浅知识友人可能知道其中部分解决方式方法,但是不明白其中的原由,很难理解为什么。如果我们需要从游戏的性能分析出发,理解Unity的优化路线,查阅之后得出以下总结,纰漏处大佬留言补充。
我们知道应用程序的优化大体可以从三个方面出发,内存连续、减少指令、多线程并行
一、 内存连续
1、代码优化
.net使用托管堆管理应用程序的主内存使用,对于托管堆上的内存回收使用GC进行处理,那么GC的问题就是我们要解决的问题,减少GC发生、适当手动GC就是我们在代码优化方面的重点。
Unity 的生命周期适当利用,游戏全局管理好线程任务,处理各个模块驱动条理清晰,可以抽象设定自定义的全局生命周期管理
2、资源优化
(1) 贴图优化
a、纯色背景图、对称纹理贴图等九宫格裁剪——减小贴图;
b、非透明图片在Alpha Source中取消通道使用——减小贴图;
c、MaxSize大小限制,但需要保证图片清晰度——减小贴图;
d、压缩,Android使用ETC,IOS使用PVRTC——减小贴图;
e、不需要动态读写的图片,Read/Write 关闭 ——减少内存占有
f、3D模型贴图涉及到摄像机远近移动的,我们需要使用MipMap进行优化,减少渲染带宽,相反非3D模型贴图且不涉及摄像机远近问题的图片,取消MipMap,减少CPU消耗;
g、打图集——减少DrawCall;
h、Batch批处理(Static Batching、Dynamic Batching)——减少DrawCall;
(2) 模型优化
a、3DMax中顶点消减,不重要面删除——减小模型顶点
b、3DMax中无用ParticleView删除——减小模型
c、Unity中Mesh
(3) 音频优化
借用此博主的详细总结 https://www.cnblogs.com/bearhb/p/11210136.html
Load Type的各个选项
Compressed In Memory – 音频剪辑将存储在RAM中,播放时将解压缩,播放时不需要额外的存储。
Streaming –音频永久存在设备上(硬盘或闪存上) ,播放流媒体方式. 不需要RAM进行存储或播放。
Decompress On Load – 未压缩的音频将存储在RAM中。这个选项需要的内存最多,但是播放它不会像其他选项那样需要太多的CPU电源。
怎么选?长音频播放消耗大量内存,如果播放时不想在内存中进行解压,有两个选择:
(1)Load Type选“Streaming”, Compression Format 选”Vorbis",使用最少的内存,但需要更多的CPU电量和硬盘I/O操作;
(2)Load Type选“Compressed In Memory”, Compression Format 选”Vorbis",磁盘I/O操作被替换成内存的消耗,请注意,要调整“Quaility”滑块以减小压缩剪辑的大小,以交换音质,一般推荐70%左右。
一般是看到底音乐占据多少内存以及你的目标机型是什么样子的,如果音乐占据的内存本身比较高,你的目标机型的内存又比较小,那么就选择第二种,这种方案会卡一点,否则选择第一种就更好
声音特效
(1)对于经常播放的和短的音频剪辑,使用“Decompress On Load”和“PCM或ADPCM"压缩格式。当选择PCM时,不需要解压缩,如果音频剪辑很短,它将很快加载。你也可以使用ADPCM。它需要解压,但解压比Vorbis快得多。
(2)对于经常播放,中等大小的音频剪辑使用”Compressed In Memory“和”ADPCM“压缩格式,比原始PCM小3.5倍,解压算法的CPU消耗量不会像vorbis消耗那么多CPU。
(3)对于很少播放并且长度比较短的声音剪辑,使用”Compressed In Memory", ADPCM 这种压缩格式,原因同(2)。
(4)对于很少播放中等大小的音频,使用”Compressed In Memory“ 和Vorbis压缩格式。这个音频可能太长,无法使用adpcm存储,播放太少,因此解压缩所需的额外CPU电量不会太多。
(4) 加载优化
对于大文件使用异步加载,资源管理做好生命管控,及时卸载不需要的(无引用)资源。常用素材内存常驻,减少I/O加载。资源模块做好分离,在不同模块直接切换时及时卸载非当前模块的资源,公共资源做好常驻。
二、减少指令
CPU向GPU发送渲染指令也是造成卡顿的主要原因,DrawCall是为减少指令发送的频率,该链接详细讲述了图形渲染 https://blog.csdn.net/qq_21397217/article/details/80401708
三、多线程并行
多线程并行的构想在Unity提出的ECS框架原理,自2018之后Unity可能会实现将部分纯逻辑放入Job线程中实现。
本文地址:https://blog.csdn.net/sinat_26574531/article/details/105845161
上一篇: unity_EasyTouch
下一篇: 游戏的商店的设计