Unity内存浅谈一

发布时间 2023-04-26 18:32:58作者: 保护我方麦阔嘞

Unity主要使用的还是c#,就先从这里写写吧

.Net 内存管理机制主要还是分为托管堆内存和非托管内存。

 

.Net托管堆内存管理主要的核心思想就是,你只管制造垃圾,它自己会帮你回收垃圾,因为自己是无法回收自己制造的垃圾的,必须依靠它的垃圾回收机制。

托管堆主要的内存产生方式就是new一个新对象,一个mmo手游同屏人数比较多时托管堆内存的的大小也应该在50-80MB以内

当使用new关键字来一个空类对象时,就会产生堆内存

在unity中,贴图,模型,网格,材质Shader等等一些文件内存,其实都不是.Net分配出来的内存,保存在堆内存的变量只是记录了一个文件内存的指针,实际则保存在非托管堆中。

那托管堆和非托管堆内存应该如何进行释放呢?

上文已经说过了,托管堆内存我们自己是无法释放的,必须等到系统垃圾回收的时候,非托管堆内存就不一样了,Unity提供了API来控制。

Resources.UnloadAsset(obj);

Resources.UnloadUnusedAssets();

第一个需要传入一个资源文件,也就是要指定释放内存,比如mesh,shader,texture

第二个是卸载无用资源,这个函数执行是比较慢的。

除了unity的资源,还有文件执行诶都属于非托管堆内存,例如:

@@@@@@

会IO错误,虽然文件流的指针指向了null,但是所占的非托管堆内存并没有被释放掉,所以再次请求就报错了,其实只需要进行一下GC,就不会报错了。

@@@@@@

fileStream指向null之后,堆内存中还没有进行释放,GC以后就会执行析构函数,等析构函数执行完毕,fileStream就会在析构函数中将文件句柄Dispose掉,后面就可以直接使用。

C#有提供一个IDisposable接口,就是专门用来主动释放非托管堆内存的,或者使用 using()就会自动调用类的Dispose方法来释放。