何时触发GC
1.在堆内存上进行内存分配操作时而内存不够的时候都会触发垃圾回收
2.GC会自动的触发,不同平台运行频率不一样
3.GC可以被强制执行
特别是在堆内存上进行内存分配时内存单元不足够的时候,GC会被频繁触发,这就意味着频繁在堆内存上进行内存分配和回收会触发频繁的GC操作。
为何禁用
如果使用的是 Mono 或 IL2CPP 脚本,我们可以通过禁用垃圾回收,来避免因为垃圾回收导致的CPU使用率激增。
以牺牲提高内存占用,来降低CPU使用率,提升游戏帧率平滑性。
在 iOS 上使用此策略时的典型堆大小约为 200KB,在 iPhone 3G 上的垃圾收集时间大约需要 5ms。如果堆大小增加到 1MB,则收集时间将大约需要 7ms。
应用场景
而通过使用固定时间间隔、或者在固定场景,比如:读取进度条、场景加载、游戏暂停等场景主动调用释放GC
禁用GC 在 WebGL 平台上和编辑器中不受支持
禁用说明
禁用垃圾回收器 通过分配 GarbageCollector.Mode.Disabled 可以完全禁用垃圾回收器。这意味着垃圾回收器线程将永远不会停止您的应用程序来执行收集。此外,调用 System.GC.Collect() 将无效并且不会启动收集。禁用垃圾回收器必须非常小心,因为禁用垃圾回收器后的持续分配将导致内存使用量的持续增加。
建议仅为长期的分配禁用垃圾回收器。例如,在游戏中,应该为一个关卡分配所有必需的内存,然后禁用垃圾回收器以避免关卡期间的开销。在关卡结束并释放所有内存之后,可以再次启用垃圾回收器,并可在加载下一关卡之前调用 System.GC.Collect() 来回收内存。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System; using UnityEngine; using UnityEngine.Scripting; public class GarbageCollectorExample { static void ListenForGCModeChange() { // Listen on garbage collector mode changes. GarbageCollector.GCModeChanged += (GarbageCollector.Mode mode) => { Debug.Log("GCModeChanged: " + mode); }; } static void LogMode() { Debug.Log("GCMode: " + GarbageCollector.GCMode); } static void EnableGC() { GarbageCollector.GCMode = GarbageCollector.Mode.Enabled; // Trigger a collection to free memory. GC.Collect(); } static void DisableGC() { GarbageCollector.GCMode = GarbageCollector.Mode.Disabled; } } |
- 本文固定链接: http://www.u3d8.com/?p=2191
- 转载请注明: 网虫虫 在 u3d8.com 发表过