Unity性能优化内存优化

如何优化内存?
1.压缩自带类库;
2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
3.释放AssetBundle占用的资源;
4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
5.使用光照贴图;
6.使用多层次细节(LOD);
7.使用着色器(Shader);
8.使用预设(Prefab)等。
 
内存开销无外乎三大部分:
1. 资源内存占用;
2. 引擎模块自身内存占用;
3. 托管堆内存占用
资源内存占用:
在一个较为复杂的大型项目中,资源的内存占用往往占据了总体内存的70%以上。因此,资源使用是否恰当直接决定了项目的内存占用情况。一般来说,一款游戏项目的资源主要可以分为以下几种:纹理(Texture),网络(Mesh),动画片段(AnimationClip)、音频片段(AudioClip)、材质(Material)、着色器(shader)、字体资源(Font)以及文本资源(TextAsset)等等。其中,纹理,网格、动画片段和音频片段则容易造成较大内存开销的资源。
纹理:
纹理资源可以说是几乎所有游戏项目中占据最大内存开销的资源。一个6万片的场景,网格资源最大才不过10MB,但一个2048*2048的纹理,可能直接就达到16MB,因此,项目中纹理资源的使用是否恰当会及大地印象项目的内存占用。
那么,纹理资源再使用时应该注意哪些地方呢?
纹理格式。纹理格式是研发团队最需要关注的纹理属性。因为它不仅影响纹理的内粗你占用,同时还决定了纹理的加载效率。一般来说,我们建议开发团队尽可能根据硬件的种类选择硬件支持的纹理格式比如Android平台的ETC、iOS平台的PVRTC、WindowsPC上的DXT等等。因此,我们在UWA测评报告中,将纹理格式进行了罗列,一边开发团队进行快速查找,一步定位。
在使用硬件支持的纹理格式时,你可能会遇到以下几个问题:
色阶问题:
由于ETC、PVRTC等格式均为有损压缩,因此,当纹理色差范围跨度较大时,均不可避免地造成不同程度的阶梯状的色阶问题。因此,很多研发团队使用RGBA32/ARGB32格式来实现更好的效果。但是,这种做法将造成很大的内存占用。比如,同样一张1024*1024的纹理,如果不开启Mipmap,并且为PVRTC格式,则其内存占用为512KB,而如果转换为RGBA32位,则很可能占用更达到4MB。所以,研发团队在使用RGBA32或ARGB32格式的纹理时,一定要慎重考虑,更为明智的选择是尽量减少纹理的色差范围,时期尽可能使用硬件支持的压缩格式进行存储。
ETC1不支持透明通道问题:
在Android平台上,对于使用OpenGLES2.0的设备,其纹理格式仅能支持ETC1格式,该格式有个较为严重的问题,即不支持Alpha透明通道,使得透明贴图无法直接通过ETC1格式来进行存储。对此。我们建议研发团队将透明贴图尽可能分成两张,即一张RGB24位纹理记录原始纹理的颜色部分和一张Alpha8纹理记录原始纹理的透明通道部分。然后,将这辆张贴图分别转化为ETC1格式的纹理,并通过特定的Shader来进行渲染,从而来达到支持透明贴图的效果。该种方法不仅可以极大程度上逼近RGBA透明贴图的渲染效果,同时还可以降低纹理的内存占用,是我们非常推荐的使用方式。
当然,目前已经有越来越多的设备支持了OpenGLES3.0这样Android平台上你可以进一步使用ETC2甚至ASTC,这些纹理格式均为支持透明通道且压缩比更为理想的纹理格式。如果你的游戏适合人群为中高端设备用户,那么不妨直接使用这两种格式来作为主要存储格式。
纹理尺寸:
一般来说,纹理尺寸越大,占用内存越大。
Mipmap功能
Mipmap旨在有效降低渲染带宽的压力,提升游戏的渲染效率。但是,开启Mipmap会有将纹理内存提升1.33倍。对于具有较大纵深感的3D游戏来说,3D场景模型和角色我们一般是建议开启Mipmap功能的,但很多2DUI纹理就不必要了。
Read&Write
一般情况下,文理资源“Read&Write”功能在Unity引擎中是默认关闭的。但是,我们仍然在项目深度优化时发现了不少项目的纹理资源会开启该选项。对此,我们建议压发团队密切关注文理资源中该选项的使用,因为开启该选项将会使文理内存增大一倍。
网格
网格资源在比较复杂的游戏中,往往占据较高的内存。
Normal\Color和Tangent(切线)
在我们深度优化过的大量项目中,Mesh资源的数据经常会含有大量的Color数据,Normal数据和Tangent数据。这些数据的存在将大幅增加Mesh资源的文件体积和内存占用。其中Color数据和Normal数据主要为3DMax、Maya等建模软件导出时设计所生成,而Tangent一般为导入引擎时生成。
更为麻烦的是,如果项目对Mesh进行DrawCallBatching操作的话,那么狠有可能进一步增加总体内存的占用。正因如此,我们在UWA测评报告中为每个Mesh展示了其Normal,Color和Tangent属性的具体使用情况,研发团队可以直接针对每种属性进行排序查看,直接定位出现冗余数据的资源。一般来说这些数据主要为Shader所用,来生成较为酷炫的效果。所以,建议研发团队针对项目中的网格资源进行详细检测,查看该模型的渲染Shader中是否需要这些数据进行渲染。
其他
动画片段
音频片段
引擎模块自身内存占用。
托管堆内存占用
posted @ 2024-05-20 10:47  weigang  阅读(13)  评论(0编辑  收藏  举报