Unity堆内存优化
unity中减少堆内存分配以减少垃圾回收处理:
只有局部变量且为值类值的变量是从stack栈中分配内存,其它所有情况都是从heap堆中分配内在。
* 缓存获取到的数据。
* 频繁被调用的函数中尽量少的分配空间。如Update函数,缓存变量或者增加时间判断每延迟多少时间后再执行一次而没必要每帧执行。
* 复用集合类变量,如List数据,当有新数据时Clear()后重新添加而不是new List()。
* 使用缓存池Object pooling,网上相关教程挺多的。
* String:
- string是引用类型,减少没必要的新string尽量缓存;
- Text组件文本若经常变化,可以考虑将不变的文本和变化的文本拆为多个Text组件;
- string的+操作每次都会产生垃圾,请用StringBuilder代替之,尤其注意在Update()中使用string;
- 不需要调用测试之后应该移除所有的Debug.Log(),每次调用至少产生并丢弃一个string,即便是空调用不输出任何东西也一样;
- 不要用 String.Compare或String.CompareTo返回0来比较相等,而是用作排序sort。(非内存优化建议)
* unity函数调用:
- 有些函数或属性每次调用都会产生新的数组并返回,尽量缓存结果,如Mesh.normals
for (int i = 0; i < myMesh.normals.Length; i++)
{
Vector3 normal = myMesh.normals[i];
}
改为
Vector3[] meshNormals = myMesh.normals;
for (int i = 0; i < meshNormals.Length; i++)
{ Vector3 normal = meshNormals[i];
}
- GameObject.name和GameObject.tag同样每次调用都会产生新的string,当检查是否相等时请使用GameObject.CompareTag()代替,它不会产生垃圾;
- 其它一些函数同样有类似的替代调用,如 Input.GetTouch() 和 Input.touchCount 代替 Input.touches, 或者 Physics.SphereCastNonAlloc() 代替Physics.SphereCastAll();
* 尽量避免装箱拆箱,如string.Format()传入值类型数据时必然存在将值类型装箱为object类型的转换。
* 协程Coroutines:
- yield return null代替yield return 0;
- 减少相同的new操作:
while (!isComplete)
{
yield return new WaitForSeconds(1f);
}
改为
WaitForSeconds delay = new WaitForSeconds(1f);
while (!isComplete)
{
yield return delay;
}
- 如果由于协程产生了很多垃圾,则可以用其它方式代替协程实现相同功能。如果主要是对时间的控制则可以将逻辑写到Update函数中;如果是控制一系列事情的先后执行顺序则可以使用事件机制(观察者模式)来实现各模块的沟通。
* 除数组外的foreach的调用会产生额外的GC,尽量少用,5.5版本后该问题被解决。
*函数引用,无论是匿名还是具名函数,都会有堆内存分配,尤其是闭包closure会增加更多的内存占用,少量使用函数引用(一般是各种delegate了)。
*LINQ和正则表达式都会由于存在装箱而产生垃圾,对性能要求比较高时应避免使用它们。
* struct结构是值类型,但当结构中包含引用类型时,垃圾回收器也不得不对整个结构进行检查,当有大的结构数组存在时就会加大垃圾回收的负担:
public struct ItemData
{
public string name;
public int cost;
public Vector3 position;
}
private ItemData[] itemData;
由于string是引用类型导致垃圾回收器对整个结构数组都需要检查,拆分出来就可以避免该问题:
private string[] itemNames; private int[] itemCosts; private Vector3[] itemPositions;
* 类被引用的数量越多,垃圾回收需要检查的工作则越大,尽量减少没必要的类引用。
* 在游戏暂停、场景切换等时机,可以主动进行垃圾回收,从而及时去除游戏中已经不必要的内存占用:
void Update()
{
if(Time.frameCount % 50 == 0)
{
System.GC.Collection();
}
}
参考:https://unity3d.com/cn/learn/tutorials/topics/performance-optimization/optimizing-garbage-collection-unity-games?playlist=44069
Unity堆内存优化的更多相关文章
- 关于ElasticSearch的堆内存设置与优化
1.什么是堆内存?Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象.在 Java 中,堆被划分成两个不同的区域:- 新生代 ( Young ).- 老年代 ( Ol ...
- java虚拟机和内存优化总结
前一段时间总结了spring和springmvc相关的知识,面试中常问到的除了这些基本的框架之外,还有底层的基础知识,比如与java虚拟机相关的知识点,这一部分也是面试中经常问到的,在面试中高级jav ...
- Elasticsearch 堆内存
转载自:https://www.lbbniu.com/6148.html 1.什么是堆内存? Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中, ...
- 关于 Unity 项目中的 Mono 堆内存泄露
关于 Unity 项目中的 Mono 堆内存泄露 题记:这是补一篇应该在将近一年前就应该写的记录,今天终于补上. 内存泄露是一个老话题了,之前我专门写过一篇 排查 Lua 虚拟机内存泄露 的文章,并且 ...
- Kafka集群优化篇-调整broker的堆内存(heap)案例实操
Kafka集群优化篇-调整broker的堆内存(heap)案例实操 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看kafka集群的broker的堆内存使用情况 1>. ...
- Unity内存优化技术测试案例
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...
- Unity内存优化
[Unity内存优化] 1.在Update方法或循环中,少用string类,因为string类的每次操作都会调用new生成新字符串对象.用StringBuilder代替string,StringBui ...
- JVM 堆内存,参数优化
Java堆内存 http://www.importnew.com/19593.html JVM诊断之查看运行参数 JVM 垃圾回收器工作原理及使用实例介绍 https://www.ibm.com/de ...
- JVM堆内存参数优化,让性能飞起来
堆内存是Java进程的重要组成部分,几乎所有与应用相关的内存空间都和堆有关.现在主要介绍与堆内存相关的参数设置,这些参数对Java虚拟机中非常重要的,也是对程序性能有着重要的影响.让你彻底脱离OOM内 ...
随机推荐
- mybatis_1
mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE co ...
- float后怎么居中
我们在用css float的时候,如何让文本水平居中真的很麻烦, [float]使div(或者其他标签)的宽度自适应其内容,但它却有个弊端:无法居中.[display:inline-block]也有同 ...
- MySQL 创建索引(Create Index)的方法和语法结构及例子
MySQL 创建索引(Create Index)的方法和语法结构及例子 MySQL 创建索引(Create Index)的方法和语法结构及例子 CREATE INDEX Syntax CREATE ...
- 数据库 简单查询 Sql Server 学生表 课程表 选课表
创建教材中的三张表格,并输入相应的数据 Create table student( Sno char(9), Same char(20), Ssex char(2), Sage smallint, S ...
- P4240 毒瘤之神的考验
题目 P4240 毒瘤之神的考验 神仙题\(emmm\) 前置 首先有一个很神奇的性质: \(\varphi(ij)=\dfrac{\varphi(i)\varphi(j)gcd(i,j)}{\var ...
- CSS3自定义下拉框菜单
在线演示 本地下载
- stack-铁轨问题
每辆火车都从A方向驶入车站,再从B方向驶出车站,同时它的车厢可以进行某种形式的重新组合.假设从A方向驶来的火车有n节车厢(n<1000),分别按顺序编号为1,2,...,n.假定在进入车站之前每 ...
- vRA Customizing error
toolsDeployPkg.log An error occurred while customizing VM vwbjvuqtest0751. For details reference the ...
- UVA 101 vector
题目链接 白书上的例题,关于vector的使用.不定长数组vector,类型内部封装了一些常用操作.vector就像一个二维数组,只有第一维的大小是固定的,可以像数组一样访问到其中的每一个元素. ve ...
- linux 系统监控好文
摘自: http://os.51cto.com/art/201005/200714_all.htm