gpt4 book ai didi

ios - Unity3d 使用内存 : load and unload prefabs

转载 作者:可可西里 更新时间:2023-11-01 03:46:06 28 4
gpt4 key购买 nike

我真的需要帮助!我不明白如何使用预制件和卸载。

我有下一个情况。

我通过 Xcode 在 iPad 上运行我的应用程序。Unity 版本 4.3.1 专业版。使用 with 观察内存:Xcode 调试导航器Xcode 仪器Unity 分析器

我接下来的步骤:

0) Unity 从空场景开始。

已用内存 XCODE Debug Navigator:11 mb 仪器:26.4 mb Unity Profiler:已用总计 13.2 预留总计 13.7

1)从资源文件夹加载预制件

prefab = Resources.Load("Room1"); 

已用内存 XCODE Debug Navigator:30.8 mb Instruments:49.54 mb Unity Profiler:已用总量19.8 预留总数 20.4

2) 实例化预制件

go = (GameObject)Instantiate(prefab); 
go.name = "Room1";

XCODE Debug Navigator: 31.2 mb Instruments: 50 mb Unity Profiler: used total 20 reserved total 20.7

3) 销毁场景中的所有对象——内存没有改变

Transform[] tr = FindObjectsOfType<Transform>(); 
for (int i = 0; i < tr.Length; i++)
{
GameObject goo = tr.gameObject;
if (goo.name != "Main Camera")
{
Destroy(goo);
goo = null;
}
}

XCODE Debug Navigator:31.1 mb Instruments:49.93 mb Unity Profiler:使用总数 19.8 保留总数 20.4

4) 调用 Resources.UnloadUnusedAssets(); - 内存没有改变

5) 调用 System.GC.Collect(); - 内存没有改变

6) 调用预制件的UnloadAsset Resources.UnloadAsset(prefab); - 内存没有改变

7) 调用 Resources.UnloadUnusedAssets(); - 内存部分清理

XCODE Debug Navigator: 21.9 mb Instruments: 40.79 mb Unity Profiler: used total 13.2 reserved total 13.9

我看到在分析器中,删除了预制件中使用的所有纹理

8) System.GC.Collect(); - 内存未更改

9) 加载空场景——内存没有改变

这是另一个有趣的时刻:

当应用程序进入后台并且我启动另一个应用程序时,已用 RAM 的大小大大减少,当我调用 unity 应用程序时 - 内存变为空场景的第一个大小。

我有下一个问题:

1) 为什么在删除预制件并调用 UnloadUnusedAssets 后内存没有完全清理 - 我们可以在 Instruments 和 Xcode 中看到它 - 但在 Profiler 中我们看到,内存几乎完全空闲?

2) 清理内存到初始大小是真的吗?

3) 我的所有步骤都是正确的还是我做错了什么?

您可以在这里下载测试项目: http://gfile.ru/aa5on

非常感谢您的回复。

最佳答案

序言

了解 RAM 使用情况是件好事。但是,问题是:到目前为止,您是否遇到过任何内存使用问题?如果不是,那么您的做法还为时过早。

一些想法

这里有一些想法供您考虑:

  1. 要阅读的重要文章:http://docs.unity3d.com/Manual/MobileProfiling.html
  2. 有 Unity 内存和单声道内存。 Mono 永远不会将内存还给操作系统:

    Once you allocate a certain amount of memory, it is reserved for mono and not available for the OS. Even when you release it, it will become available internally for Mono only and not for the OS. The heap memory value in the Profiler will only increase, never decrease.

  3. 预制件和游戏对象只是一大堆链接,因此它们不会像资源那样占用大量内存。
  4. Object.Destroy doesn't destroy object instantly :

    Actual object destruction is always delayed until after the current Update loop, but will always be done before rendering.

  5. Resources.UnloadUnusedAssets 是异步的。它不会立即卸载所有内容。
  6. Unity 的文档中没有提到 Resources.UnloadAsset(Object assetToUnload) 将卸载 assetToUnload 引用的资源。

说明

我不能称自己为内存管理专家(Unity 和 Mono)。但我是这样理解发生了什么的:

  1. 1) Load prefab from Resources folder

    Prefab 加载了它引用的所有资源。内存使用量增加。现在一切都清楚了。

  2. 2) Instantiate prefab

    内存使用量增加了一点以容纳预制克隆。

  3. 3) Destroy all objects on scene - memory not changed

    有趣的事情来了 :) 实际上,根据 Unity 的分析器,内存使用情况发生了变化:它与预制件实例化之前的情况相同。所以,看起来 Unity 已经发布了一些与预制实例直接相关的东西。但是,正如所说,mono 不会将内存返回给操作系统(即使它这样做了,它甚至还没有时间这样做)。

  4. 4) Call Resources.UnloadUnusedAssets(); - memory not changed

    Resources.UnloadUnusedAssets 无法在这里卸载任何东西,因为仍然没有未使用的 Assets :虽然对象被标记为销毁,但实际的垃圾收集还没有发生。

  5. 5) Call System.GC.Collect(); - memory not changed.

    因为它是由mono管理的内存。

  6. 6) Call UnloadAsset of prefab Resources.UnloadAsset(prefab);

    我相信这里的内存使用量有所下降(100K-200K 左右),但您没有注意到。但是,正如我上面提到的,UnloadAsset 不会卸载您作为参数传递给 UnloadAsset 的对象所引用的资源。

  7. 7) Call Resources.UnloadUnusedAssets(); - memory partially cleaned

    在第 5 步,您调用了 GC.Collect(),收集已经发生,现在一些 Unity Assets 没有对它们的引用。因此,他们最终可以被释放。这就是释放内存的原因。

  8. 8) System.GC.Collect(); - memory not changed

    以上解释

  9. 9) Load empty scene - memory not changed

    所有可以被释放的东西都已经被释放了。因此内存使用没有变化。

关于ios - Unity3d 使用内存 : load and unload prefabs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24077100/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com