- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我真的需要帮助!我不明白如何使用预制件和卸载。
我有下一个情况。
我通过 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 使用情况是件好事。但是,问题是:到目前为止,您是否遇到过任何内存使用问题?如果不是,那么您的做法还为时过早。
这里有一些想法供您考虑:
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.
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.
Resources.UnloadUnusedAssets
是异步的。它不会立即卸载所有内容。Resources.UnloadAsset(Object assetToUnload)
将卸载 assetToUnload
引用的资源。 我不能称自己为内存管理专家(Unity 和 Mono)。但我是这样理解发生了什么的:
1) Load prefab from Resources folder
Prefab 加载了它引用的所有资源。内存使用量增加。现在一切都清楚了。
2) Instantiate prefab
内存使用量增加了一点以容纳预制克隆。
3) Destroy all objects on scene - memory not changed
有趣的事情来了 :) 实际上,根据 Unity 的分析器,内存使用情况发生了变化:它与预制件实例化之前的情况相同。所以,看起来 Unity 已经发布了一些与预制实例直接相关的东西。但是,正如所说,mono 不会将内存返回给操作系统(即使它这样做了,它甚至还没有时间这样做)。
4) Call Resources.UnloadUnusedAssets(); - memory not changed
Resources.UnloadUnusedAssets
无法在这里卸载任何东西,因为仍然没有未使用的 Assets :虽然对象被标记为销毁,但实际的垃圾收集还没有发生。
5) Call System.GC.Collect(); - memory not changed.
因为它是由mono管理的内存。
6) Call UnloadAsset of prefab Resources.UnloadAsset(prefab);
我相信这里的内存使用量有所下降(100K-200K 左右),但您没有注意到。但是,正如我上面提到的,UnloadAsset
不会卸载您作为参数传递给 UnloadAsset
的对象所引用的资源。
7) Call Resources.UnloadUnusedAssets(); - memory partially cleaned
在第 5 步,您调用了 GC.Collect(),收集已经发生,现在一些 Unity Assets 没有对它们的引用。因此,他们最终可以被释放。这就是释放内存的原因。
8) System.GC.Collect(); - memory not changed
以上解释
9) Load empty scene - memory not changed
所有可以被释放的东西都已经被释放了。因此内存使用没有变化。
关于ios - Unity3d 使用内存 : load and unload prefabs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24077100/
在撰写本文时,Unity 有一个名为 Unity LTS 2017.4.12f1 的版本,Unity 的最新版本是 2018.2.11 我知道 Unity LTS 应该是稳定版本,但这是否意味着 Un
我需要 Unity 来捕获所有按键,即使 Unity 没有焦点。 我尝试过使用: Input.KeyPress() 但这似乎只有在 Unity 拥有用户输入焦点的情况下才有效。我需要它在没有焦点时工作
我正在尝试统一实现一个TCP服务器。我正在使用 unity pro 3.5,当我在场景中运行此代码时,unity 挂起,完全没有响应,直到我用任务管理器杀死它。 using UnityEngine;
我想问一下,使用新的unity ads 2.0与unity ads相比,收入有什么区别 Unity Ads Unity Ads 2.0 最佳答案 Unity 广告支持 Unity 4.2.2 或更高版
当我运行我的应用程序时,我希望 Unity 打开两个窗口。 window 将有不同的摄像头,但两者都会看到同一个世界。 这样的事情可能吗? (我还没有找到任何证据表明这一点) 我知道我可以通过两个 U
我使用Unity Hub下载了最新的Unity编辑器,它对于编辑器、文档和语言包运行良好,但无法下载android构建支持。刚刚告诉我这两天下载失败很多次。 所以我从网页下载了UnitySetup-A
我使用Unity Hub下载了最新的Unity编辑器,它对于编辑器、文档和语言包运行良好,但无法下载android构建支持。刚刚告诉我这两天下载失败很多次。 所以我从网页下载了UnitySetup-A
我今天已将我的项目升级到 Prism 6.3.0 和 Unity 5.3.1。在此之前,我有 Prism 5 和 Unity 4。 现在我遇到了 Prism.Unity.UnityBootstrapp
Unity 中是否有与 StructureMap 中的 Registry 类等效的内容? 我喜欢考虑一个层/组件/库来自行配置它 - 从而填充容器。所以“父”层只需要知道注册类。 最佳答案 不,没有。
我似乎无法在任何地方找到 Microsoft.Practices.Unity.StaticFactory.dll。 还有其他注册静态工厂的方法吗? 寻找这样的东西 container.Register
是否可以统一尝试所有已定义的构造函数,从参数最多的构造函数到最不具体的构造函数(默认构造函数)? 编辑 我的意思是说: foreach (var constructor in concrete.Get
我有一个正在运行且运行良好的 Unity 应用程序,但我们目前正在通过对所有编译警告采取行动来清理我们的代码。 由于过时的 Microsoft.Practices.Unity.Configuratio
我正在使用 Visual Studio Code 在 Unity 中编写脚本。在“编辑”-“首选项”-“外部工具”-“外部脚本编辑器”下,我也选择了 VS Code。 打开脚本工作正常,但是当我尝试通
因此,我很确定这不是提出此类问题的正确论坛,因此我非常感谢有人将我链接到针对此问题的更好论坛(如果需要)。 我的问题: 在 Unity Hub 中,我进行了设置,以便 Unity 编辑器应下载到我的硬
问题:即使在 Cardboard 相机范围内,我也无法在任何地方看到我的 UI 文本。 截图: 我使用的是Unity 5.4.0b21版本,有人说可以通过降级到Unity 5.3版本来修复。 但是,我
我正在开发一个 Unity 项目,我正在使用 Google VR SDK for Unity 和 FirebaseMessaging.unitypackage 适用于 Unity 的 Firebase
好吧,在谷歌、这里和几个 ASP/MVC 论坛上搜索之后,我一定要问我到底做错了什么。 我的应用程序有一个良好的开端,对 DI、IoC 有很好的理解,并且正在使用 Repository、Service
我们最近将项目中的 Microsoft Unity 从 3.5.1404 版本升级到 5.8.6。在我们的代码中只做了一些小的调整,这次升级似乎很容易。它毫无问题地解决了我们所有注册的实例。但是,我们
我正在弄清楚使用 Unity 应用程序 block 时的意外行为。我有项目 A 作为我的启动项目。 项目 A 具有对项目 B 的项目引用,而项目 B 具有对项目 C 的项目引用。 项目 A 使用 un
我将 Unity 与 MVC 和 NHibernate 结合使用。不幸的是,我们的 UnitOfWork 驻留在不同的 .dll 中,并且它没有默认的空 .ctor。这是我注册 NHibernate
我是一名优秀的程序员,十分优秀!