Unity UWA内存优化总结列表

1.2 Unity性能优化进无止境之内存篇(基础篇)

谈优化必谈内存,该文深入浅出地分析了Unity项目的内存占用

内存开销无非三大块:资源内存占用,引擎模块内存占用,托管内存占用

Mipmap ,Willams将低一级图像的每边的分辨率取为高一级图像的每边的分辨率的二分之一,而同一级分辨率的纹理组则由红,绿,蓝三个分量的纹理数组组成。由于这一个查找表包含了同一纹理区域在不同分辨率下的纹理颜色值,因此被省委MipMap

ETC1不支持透明通道问题,将透明贴图拆分成2张,一张RGB24位纹理记录原始纹理的颜色部分,一张alpha8记录原始纹理透明通道部分。然后把这两张转成ETC1格式的纹理,并通过特定的Shader进行渲染。该种方法可以降低纹理的内存占用!!

MipMap主要在于有效降低渲染带宽的压力,提升游戏的渲染效率。但是开始MipMap会将纹理内存提升1.33倍。3D场景模型和角色建议开启MipMap功能,但是UI纹理部分需要关闭!!

纹理资源的Read & Write”功能在Unity引擎中是默认关闭的。因为开启后,会使纹理内存增大一倍!!!

累积的函数堆内存分配量,定位是否有分配不必要堆内存的代码存在,研发团队切记不要在Update、FixUpdate或较高调用频率的函数中开辟堆内存,这会对你的项目内存和性能均造成非常大的伤害

1.3 Unity性能优化进无止境之内存篇(进阶篇)

内存泄露、Mono无效堆内存、资源冗余...你关注的内存问题都在这里!

方法1:通过比较不同时刻同一场景的资源信息,可以快速帮你找到其资源使用的差异情况

方法2:通过比较两种不同类型的场景,你可以直接查看比较结果中的“共同资源”,并判断其是否确实为预先设定好的常驻资源

方法3:Unity Profiler Memeoy->Detail->Take Sample->Texture 查看当前帧纹理占用内存大小,如果出现冗余,可能是因为Texture没有打成Bundle,如果A依赖1,B也依赖1,如果不把1打成AB,那么加载A和加载B后,1就会有两份

方法4:无效的堆内存开销,因为堆内存只要申请后就无法回收的。所以避免一次性堆内存的过大分配,避免不必要的堆内存开销

 方法5:如果大家用的UntiyGameFrameWork框架打的AB文件,可以通过GameFramWork->AssetBundle Analyzer 进行分析冗余的资源

1.5 AssetBundle内存管理机制

AssetBundle真是个绝妙的设计,但是想说爱你不容易!

2.4.1 Lua性能优化—Lua内存优化

2.4.6 Unity匿名函数的堆内存优化

2.4.9 AssetBundle进阶内存优化(Unity 4.x)

2.5.3 Unity手游iOS内存分析和测试

2.5.12 Unity中ShaderLab内存优化

2.5.13 使用UWA GOT优化Unity性能和内存

4.5 UWA 六月直播季 | 6.8 移动游戏加载性能和内存管理全解析

4.6 5.4 UWA直播回顾:Unity游戏的代码堆内存优化

游戏中大部分内存泄漏,是由于静态对象引起的。因为静态对象的是GC的根节点,因此没有对象引用。如果将一个堆内存分配,赋予给这个静态对象,那么这个堆内存将不会释放。除非将静态对象置位NULL

第一行说明在OnGUI函数中生成了一个A类型的对象,其指针为1533098928,第二行说明在OnGUI()->A:.cotr()中生成了一个Int32[]类型的对象,并且该对象被指针为1533098928的对象引用。即new int[1000]对象被objectA引用,这也是导致new int[1000]对象无法被GC回收的原因。而objectA本身是一个静态对象,是GC的根节点,因此没有对象引用。
如果需要生成的new int[1000]对象被回收怎么做呢?很简单,将objectA.a设置为null,没有了objectA对其的引用,自然会被GC回收了。需要说明的是,将objectA.a设置为null只是断绝了引用关系,真正对象的回收要等到GC的时候才会进行,“Cube”在获取内存快照的时候会首先进行一次GC,防止由于没有及时调用GC导致的误判。

猜你喜欢

转载自blog.csdn.net/zphshiwo/article/details/80889321