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内 ...
随机推荐
- let和var以及const有什么区别
在JavaScript中有三种声明变量的方式:var.let.const. var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用. for(var i=0;i&l ...
- HDR(High Dynamic Range) - 高动态范围
1. Dynamic Range 动态范围是指一个场景的最亮和最暗部分之间的相对比值 2. Tone-mapping 现实真正存在的亮度差,即最亮的物体亮度和最暗的物体亮度之比为 , 而人类的眼睛 ...
- P3160 [CQOI2012]局部极小值
题目 P3160 [CQOI2012]局部极小值 一眼就是状压,接下来就不知道了\(qwq\) 做法 我们能手玩出局部小值最多差不多是\(8,9\)个的样子,\(dp_{i,j}\)为填满\(1~i\ ...
- 申请内存的方式(1,malloc/free;2,new/delete)
一.malloc/free的方式 // 4个int 的大小int *p = (int*) malloc(16); for (int i = 0; i < 4; ++i) { p[i] = i; ...
- 汇编语言入门(在debug中编辑和调试程序)
2013-06-02 17:09 4252人阅读 评论(2) 收藏 举报 分类: 汇编语言(1) 版权声明:本文为博主原创文章,未经博主允许不得转载. 我们在Windows中进入的Dos方式,实际 ...
- 【JavaScript学习整理】DOM对象(location history screen navigator)
DOM: 描述网页各个组成部分之间的关系. parentNode: 父节点 childNode: 子节点 firstChild: 第一个子节点 lastChild: 最后一个子节点 nextSibli ...
- JAVAScript中DOM与BOM的差异分析
JAVAScript 有三部分构成,ECMAScript,DOM和BOM,根据浏览器的不同,具体的表现形式也不尽相同.我们今天来谈一谈DOM和BOM这俩者之间的差异. 用百科上的来说: 1. DOM是 ...
- java:类集操作总结
java:类集操作总结 1.List接口允许有重复的元素,Set接口中不允许有重复的元素 2.ArrayList,和Vector的区别 3.set依靠equals和hashCode区分 4.TreeS ...
- jQuery - 获取/设置内容和属性
获得内容 - text().html() 以及 val() 三个简单实用的用于 DOM 操作的 jQuery 方法: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元 ...
- C++(二)— STL容器的基本用法
1.vector基本操作 关于vector简单的讲就是一个动态增长的数组,里面有一个指针指向一片连续的内存空间,当空间装不下的时候会自动申请一片更大的空间(空间配置器)将原来的数据拷贝到新的空间,然后 ...