如何优化内存?Unity中的内存种类;冯乐乐的总结的优化技术。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/taotaoah/article/details/52484439

1 。 有很多种方式

例如

1.压缩自带类库;

2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;

3.释放AssetBundle占用的资源;

4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;

5.使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。

LOD技术有点类似于Mipmap技术,不同的是,LOD是对模型建立了一个模型金字塔,根据摄像机距离对象的远近,选择使用不同精度的模型。它的好处是可以在适当的时候大量减少需要绘制的顶点数目。它的缺点同样是需要占用更多的内存,而且如果没有调整好距离的话,可能会造成模拟的突变。

在Unity中,可以通过LOD Group来实现LOD技术:

Unity中的内存种类

实际上Unity游戏使用的内存一共有三种:程序代码、托管堆(Managed Heap)以及本机堆(Native Heap)。

优化程序代码的内存占用

主要就是减少打包时的引用库,改一改build设置即可,库剥离的优化方法。

托管堆,

托管”的意思是Mono“应该”自动地改变堆的大小来适应你所需要的内存,并且定时地使用垃圾回收(Garbage Collect)来释放已经不需要的内存。

首先需要明确,托管堆中存储的是你在你的代码中申请的内存。

你要做的就是在尽可能早的时间将不需要的引用去除掉,这样回收机制才能正确地把不需要的内存清理出来。但是需要注意在内存清理时有可能造成游戏的短时间卡顿,这将会很影响游戏体验,因此如果有大量的内存回收工作要进行的话,需要尽量选择合适的时间。


本机堆的优化


当关卡呈现在用户面前的时候,所有Unity编辑器能认识的本关卡的资源都已经被预先加入内存了,

因为移动设备能使用的资源始终非常有限因此在面向移动设备游戏的制作时,尽量减少在Hierarchy对资源的直接引用,而是使用Resource.Load的方法,在需要的时候从硬盘中读取资源,在使用后用Resource.UnloadAsset()和Resources.UnloadUnusedAssets()尽快将其卸载掉。

尽量减少代码的耦合和对其他脚本的依赖是十分有必要的如果确实无法避免这种情况,那应当手动地对这些不再使用的引用对象调用Destroy()或者将其设置为null。这样在垃圾回收的时候,这些内存将被认为已经无用而被回收。


三、冯乐乐的总结的优化技术。

有两种主要的计算资源:CPU(负责其中的帧率)和GPU(负责分辨率相关的一些东西)。

总结起来的性能瓶颈在于以下四点:

1,在CPU方面:过多的DrawCalls;复杂的脚步或者物理模拟。

2,在顶点处理方面:过多的顶点;过多的逐像素计算。

3,在像素(Fragment)处理方面:过多的fragment, overdraws;过多的住像素计算。

4,在宽带方面:尺寸很大且未压缩的纹理;分辨率过高的framebuffer。

所以涉及到的优化技术有以下几点:

1,顶点优化方面:

A,优化几何体;(尽量减少模型中的三角形的数目,尽可能重用顶点)

B、使用LOD(Level of details)技术;

C、使用遮挡剔除(Occulusino culling)技术。

2,  像素优化方面:控制绘制顺序;警惕透明物体;减少实时关照。

3, CPU优化方面:减少DrawCalls。

4, 宽带优化:减少纹理大小,利用缩放。







阅读更多
换一批

没有更多推荐了,返回首页