Unity内存,原生内存(Native Memory)和托管内存(Managed Memory
其中Native Memory大家接触的会比较少,而且可操控性也比较少,例如AssetBundle,Texture,Audio这些所占的内存,这一部分内存是由Unity自身来进行管理的。我们平时开发通常会接触到的是Managed Memory,也就是我们自己定义的各种类
创建内存
第一种new和delete:
Obj *a = new Obj;
delete a;
第二种malloc和free:
Obj *a = (obj *)malloc(sizeof(obj));
free(a);
首先new属于c++的操作符(类似于 +、-等),而malloc是c里面的函数,理论上来讲操作符永远快于函数。
其次new分配成功时,返回的是对象类型的指针,无须进行类型转换,而分配失败则会抛出Exception。而malloc分配成功则是返回void * ,需要通过强制类型转换变为我们需要的类型,分配失败只会返回一个空(NULL)。
然后还有非常重要的一点就是,malloc基本上大家的实现是类似的,new却各有各的不同。我们知道new会去调用构造函数(constructor),所以很多人会把new理解成malloc+constructor,但是这种理解是错误的。因为在c++实现的standard里,你会发现new会不会调用malloc完全由new库的实现来自行决定,也就是说new和malloc是两者独立的。
另外从严格的c++和c的意义上来讲,他们分配内存的位置是不一样的,new会分配在自由存储区(Free Store),而malloc会分配在堆(heap)上。这两者的区别简单来说,你new分配的内存再delete后是否直接释放还给系统是由new自己来决定的,而malloc分配的内存再free后是一定会还回去的。
MemoryManager.FallbackAllocation的Tag 栈内存满了。 FallBack到我们的主堆分配器。 耗时长 处理办法 1. 分帧处理 。2。 改源码的 栈内存默认大小。
Managed Memory
unity 一次gc 。
当脚本尝试在托管堆上进行分配但没有足够的可用堆内存来容纳分配时,Unity 会运行垃圾收集器。
当垃圾收集器运行时,它会检查堆中的
所有对象,并将应用程序不再引用的任何对象标记为删除。
Unity 然后删除未引用的对象,从而释放内存。
GC的实现
实现GC的策略有很多种,其中最常见一种就是 Tracing garbage collection,或者叫 Mark-Sweep,(unity 用这个)这种算法会通过一个 root Object,遍历这个该对象引用的变量,并且标记,递归这个过程,这样就确定了所有reachable的对象,剩下的对象即视为garbage。
另一种常见的策略还有引用计数(Reference counting),它是通过为每个对象维护一个引用计数,这代表当前对该对象的引用数目,当引用为0,即代表该对象为 Garage。引用技术有如下缺点
- 循环引用问题
- 保存计数带来的空间开销
- 修改引用数目带来的速度开销以及原子性要求
- 非实时(一个引用的变化可能递归得导致一系列引用修改,内存释放)
有很多算法可以一定程度解决上述问题,顺便一提,C++使用的智能指针即是基于引用计数实现的,COM对象也使用了引用计数来管理。
增量式GC(incremental garbage collection)
上文提到的 Unity GC实现是非分代式的,也就是是说,要么不做,要做就一次性作完。unity 在 2018 的版本推出了所谓增量式GC的功能,还是基于 Boehm–Demers–Weiser garbage collector 的实现,但是不再是非分代式的,这能带来特别的技巧♂中第二点同样的好处,即均衡负载到多帧,消除毛刺。可以缓解卡顿。因为GC的执行分配到每帧了,所以单帧GC的执行时间会受到垂直同步 还有 unity 的 Application.targetFrameRate 的影响。文章来源:https://www.toymoban.com/news/detail-406637.html
增量式GC目前还是抢先体验版本,因为它事实上还是存在一些问题,它的基本实现原理还是标记-清扫,但是在两次增量式GC之间,对象的引用可能会发生变化,导致前一次GC的标记失效,需要重新进行遍历标记,最糟的情况会退化为普通的非分代GC(其实更糟,因为前面的工作全白费了)。比如这样的代码文章来源地址https://www.toymoban.com/news/detail-406637.html
到了这里,关于unity-内存GC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!