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方法来释放。