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堆内存优化的更多相关文章

  1. 关于ElasticSearch的堆内存设置与优化

    1.什么是堆内存?Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象.在 Java 中,堆被划分成两个不同的区域:- 新生代 ( Young ).- 老年代 ( Ol ...

  2. java虚拟机和内存优化总结

    前一段时间总结了spring和springmvc相关的知识,面试中常问到的除了这些基本的框架之外,还有底层的基础知识,比如与java虚拟机相关的知识点,这一部分也是面试中经常问到的,在面试中高级jav ...

  3. Elasticsearch 堆内存

    转载自:https://www.lbbniu.com/6148.html 1.什么是堆内存? Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中, ...

  4. 关于 Unity 项目中的 Mono 堆内存泄露

    关于 Unity 项目中的 Mono 堆内存泄露 题记:这是补一篇应该在将近一年前就应该写的记录,今天终于补上. 内存泄露是一个老话题了,之前我专门写过一篇 排查 Lua 虚拟机内存泄露 的文章,并且 ...

  5. Kafka集群优化篇-调整broker的堆内存(heap)案例实操

    Kafka集群优化篇-调整broker的堆内存(heap)案例实操 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看kafka集群的broker的堆内存使用情况 1>. ...

  6. Unity内存优化技术测试案例

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  7. Unity内存优化

    [Unity内存优化] 1.在Update方法或循环中,少用string类,因为string类的每次操作都会调用new生成新字符串对象.用StringBuilder代替string,StringBui ...

  8. JVM 堆内存,参数优化

    Java堆内存 http://www.importnew.com/19593.html JVM诊断之查看运行参数 JVM 垃圾回收器工作原理及使用实例介绍 https://www.ibm.com/de ...

  9. JVM堆内存参数优化,让性能飞起来

    堆内存是Java进程的重要组成部分,几乎所有与应用相关的内存空间都和堆有关.现在主要介绍与堆内存相关的参数设置,这些参数对Java虚拟机中非常重要的,也是对程序性能有着重要的影响.让你彻底脱离OOM内 ...

随机推荐

  1. iOS category 类别 和 extension 扩展

    category  类别 又称为 分类 在ios项目开发中允许使用类别为现有的类添加新的方法,并不需要创建子类.通过类别我们可以动态地为现有的类添加新的方法,可以将类的定义模块化地布局到多个相关文件中 ...

  2. 隐藏c语言烦人的{ }

    .vimrc文件中添加 autocmd BufNewFile,BufRead * :syn match braces conceal "[{}]" set conceallevel ...

  3. Google员工自述:在哈佛教书和在Google工作的差别

    感谢伯乐在线的投递编者按:2003年到2010年期间,原文作者Matt Welsh 是哈佛大学工程和应用科学学院的计算机科学系教授.2010年加入Google,是一名高级工程师.他当前的工作重点是广域 ...

  4. windows下Scrapy爬虫框架环境搭建

    1.   安装python 根据你的需求下载python安装包,安装python(本文基于python27)https://www.python.org/downloads/ 下载完安装默认安装路径, ...

  5. Spark- Action实战

    Spark- Action实战 package cn.rzlee.spark.core import org.apache.spark.rdd.RDD import org.apache.spark. ...

  6. Source not found The source attachment does not contain the source for the file MethodBeforeAdvice.class

  7. fastjson转对象的一些属性设置

    <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> < ...

  8. vue2.0使用Sortable.js实现的拖拽功能

    简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jQuery ui中的sortable.js,只是在拖拽完成后,在update的回调函数中又重新排序了存放数据的数组.但 ...

  9. leetcode 2 Add Two Numbers(链表)

    数字反过来这个没有什么麻烦,就是镜像的去算十进制加法就可以了,然后就是简单的链表. /** * Definition for singly-linked list. * struct ListNode ...

  10. 20179203 《Linux内核原理与分析》第十周作业

    第17章 设备与模块 一.设备类型 1. Linux及Unix系统: 块设备 字符设备 网络设备 2.块设备: 通常缩写为blkdev,它是可寻址的,寻址以块为单位,块大小随设备不同而不同:块设备通常 ...