我正在制作 2D 互动漫画,分为“剧集”。
目前我正在使用 Unity Profiler 进行内存优化。
我的目标是仅将用户选择观看的剧集加载到 RAM 中。
为此,我正在使用:
GameObject prefab = Resources.Load ("name_prefab") as GameObject;
GameOject obj = Instantiate (prefab) as GameObject;
当我销毁剧集时,请执行以下命令:
Destroy (obj);
obj = null;
Resources.UnloadUnusedAssets ();
但内存使用并没有像我预期的那样改变。
我究竟做错了什么?
在我正在做的 assetBundle 的替代使用中,但我更愿意避免使用它们,因为当时剧集仅在本地出现,这似乎是一种浪费。
这是another post有同样的问题更好地解释,但他没有答案。
最佳答案
Resources.UnloadUnusedAssets();
释放分配给超出范围的 Assets 对象的内存。在您提供的代码片段中,对预制件的引用仍然存在。这可能是预制件仍然留在内存中的主要原因。
即使存在标记为“应该销毁”的对象,分配给这些对象的内存也不会立即释放。运行在幕后的垃圾收集器的工作是决定什么时候应该清理挥之不去的垃圾。
垃圾收集涉及对性能带来影响的昂贵操作。这就是垃圾收集器偶尔会做它的工作的原因。通常,它会在您更改场景或内存使用量达到特定阈值时发挥作用。网上可以找到很多文章。相信official manual可以让你对这个话题有一个基本的了解。
Unity 声明,更改场景将清除原始场景中的所有内容,除了标记为不被 DontDestroyOnLoad(targetObject);
破坏的对象之外的所有内容。 .如果你真的很在意内存使用,或许你可以尝试稍微修改一下应用程序的结构。所以每一集都被保存为一个场景,而不是一个预制件。
关于memory-management - 释放内存销毁预制件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24824591/