如何解决编译时内存分配错误统一
我经常在编译时遇到统一的内存分配错误。 Afaik 这可能是由于资产数量非常多,或者是由于资产可能太大。
我观察到大多数时候产生问题的内存量是一样的: 134217728B 16 对齐。
注意“大部分时间”,并非总是如此。
1.- 有没有办法知道与崩溃中未能分配的内存量相关的特定资产是什么?
2.- 有没有办法根据项目大小、资产数量或任何其他相关参数来评估您的机器可能需要的 ram 内存量?
崩溃与某些编译任务缺少我有关。我的观点是,即使这种错误难以识别/调试解决,分配的大小几乎总是相同的事实(在这种情况下134217728
),可能有一些提示来了解资产责任或一些防止崩溃的行动建议。
编辑:
根据我正在研究的内容,阅读documentation,这似乎是关键:“考虑加载操作。如果在繁重的资产加载操作期间生成了大量临时对象,并且这些对象直到操作完成才被引用,然后垃圾收集器无法释放这些临时对象,托管堆需要扩展——即使它包含的许多对象将在短时间内释放。”
然后,关键是识别有问题的资产并将其切碎以实现更顺畅的内存分配。
图像和下面日志的相关部分。
图片:
Editor.log 的相关部分:
完成脚本编译后重新加载程序集。
开始 MonoManager ReloadAssembly
DynamicHeapAllocator 分配探测 1 失败 - 无法获得大分配的内存 134217728。
DynamicHeapAllocator 分配探测 2 失败 - 无法获得大量分配的内存 134217728。
DynamicHeapAllocator 分配探测 3 失败 - 无法获得大分配的内存 134217728。
DynamicHeapAllocator 分配探测 4 失败 - 无法获得大分配的内存 134217728。
DynamicHeapAllocator 内存不足 - 无法为大量分配获取内存 134217728!
无法分配内存:系统内存不足!
尝试分配:134217728B,16 对齐。内存标签:动态数组
分配发生在: Line:75 in C:\buildslave\unity\build\Runtime/Utilities/dynamic_array.h
内存概览
[ ALLOC_DEFAULT ] 使用:1759593661B |峰值:0B |保留:2040112693B
[ ALLOC_TEMP_JOB ] 使用:0B |峰值:0B |保留:16777216B
[ ALLOC_TEMP_BACKGROUND_JOB ] 使用:0B |峰值:0B |保留:1048576B
[ ALLOC_GFX ] 使用: 9760199558B |峰值:0B |保留:9803569966B
[ ALLOC_CACHEOBJECTS ] 使用: 547232668B |峰值:0B |保留:810108412B
[ ALLOC_TYPETREE ] 使用:102395080B |峰值:0B |保留:119537664B
[ ALLOC_PROFILER ] 使用:63528720B |高峰:63834568B |保留:67108864B
[ ALLOC_PROFILER_EDITOR ] 使用:22288B |峰值:31520B |保留:1048576B
[ ALLOC_TEMP_THREAD ] 使用: 32768B |峰值:0B |保留:23199744B
无法分配内存:系统内存不足!
尝试分配:134217728B,16 对齐。内存标签:动态数组
分配发生在:C:\buildslave\unity\build\Runtime/Utilities/dynamic_array.h 中的第 75 行
内存概览
[ ALLOC_DEFAULT ] 使用:1759593661B |峰值:0B |保留:2040112693B
[ ALLOC_TEMP_JOB ] 使用:0B |峰值:0B |保留:16777216B
[ ALLOC_TEMP_BACKGROUND_JOB ] 使用:0B |峰值:0B |保留:1048576B
[ ALLOC_GFX ] 使用:9760199558B |峰值:0B |保留:9803569966B
[ ALLOC_CACHEOBJECTS ] 使用: 547232668B |峰值:0B |保留:810108412B
[ ALLOC_TYPETREE ] 使用:102395080B |峰值:0B |保留:119537664B
[ ALLOC_PROFILER ] 使用:63528720B |高峰:63834568B |保留:67108864B
[ ALLOC_PROFILER_EDITOR ] 使用:22288B |峰值:31520B |保留:1048576B
[ ALLOC_TEMP_THREAD ] 使用: 32768B |峰值:0B |保留:23199744B
编辑:我还发布了日志的其余部分,以防万一它可能对您有帮助
[性能] WebView.DoCefMessages:2459 个样本,峰值。 228 毫秒 (374.1x),平均609 我们,总计。 1.497 秒 (0.0%)
[性能] WebView.CheckCurlRequests:699 个样本,峰值。 230 us (103.8x),平均2.22 我们,总计。 1.550 毫秒 (0.0%)
[性能] License.Tick:175393 个样本,峰值。 12.0 毫秒 (6922.7x),平均1.73 us,总计。 303.2 毫秒 (0.0%)
[性能] UnityConnect.Tick:94325 个样本,峰值。 3.24 毫秒 (490.2x),平均6.61 us,总计。 623.6 毫秒 (0.0%)
[性能] PackageManager::RunRequestSynchronously:4 个样本,峰值。 37.4 毫秒 (3.5x),平均10.7 毫秒,总计。 42.74 毫秒 (0.0%)
[性能] Projectbrowser.OnGUI:2654 个样本,峰值。 5.39 秒 (959.3x),平均5.62 毫秒,总计。 14.91 秒 (0.2%)
[性能] SceneHierarchyWindow.OnGUI:21680 个样本,峰值。 5.05 秒 (2197.0x),平均2.30 毫秒,总计。 49.86 秒 (0.6%)
[性能] InspectorWindow.OnGUI:7630 个样本,峰值。 3.12 秒 (208.8x),平均14.9 毫秒,总计。 113.9 秒 (1.3%)
[性能] GameView.OnGUI:426770 个样本,峰值。 535 毫秒 (897.9x),平均596 我们,总计。 254.5 秒 (2.9%)
[性能] ConsoleWindow.OnGUI:2494 个样本,峰值。 32.8 毫秒 (64.9x),平均505 我们,总计。 1.260 秒 (0.0%)
[性能] SceneView.OnGUI:152351 个样本,峰值。 310 毫秒 (66.7x),平均4.64 毫秒,总计。 707.3 秒 (8.2%)
[性能] SceneButtons.OnGUI:122 个样本,峰值。 496 毫秒 (115.2x),平均4.31 毫秒,总计。 525.6 毫秒 (0.0%)
[性能] ApplicationTickTimer:354737 个样本,峰值。 499 秒 (40957.4x),平均12.2 毫秒,总计。 4.320 秒 (49.9%)
[性能] VCProvider:354738 个样本,峰值。 447 us (318.4x),平均1.41 美元,总计。 498.5 毫秒 (0.0%)
[性能] MonoCompiler.Tick:30126 个样本,峰值。 16.2 秒 (25084.8x),平均644 我们,总计。 19.40 秒 (0.2%)
[性能] Internal_SwitchSkin:354737 个样本,峰值。 28.7 us (744.5x),平均38.5 纳秒,总计。 13.67 毫秒 (0.0%)
[性能] Collab.Tick:93099 个样本,峰值。 528 us (292.8x),平均1.80 美元,总计。 167.9 毫秒 (0.0%)
[性能] WebView.Tick:172938 个样本,峰值。 443 毫秒 (5178.0x),平均85.5 美元,总计。 14.79 秒 (0.2%)
[性能] CurlRequest.Tick:56494 个样本,峰值。 20.9 毫秒 (12761.9x),平均1.64 us,总计。 92.53 毫秒 (0.0%)
[性能] SceneBackgroundTask.Tick :38635 个样本,峰值。 62.4 us (268.6x),平均232 纳秒,总计。 8.975 毫秒 (0.0%)
[性能] Scheduler.Tick:298816 个样本,峰值。 2.29 毫秒 (63.6x),平均36.1 我们,总计。 10.77 秒 (0.1%)
[性能] RepaintAllProfilerWindows:11972 个样本,峰值。 1.14 毫秒 (674.7x),平均1.68 us,总计。 20.15 毫秒 (0.0%)
[性能] PlayerUpdates.Tick:93092 个样本,峰值。 455 us (19.1x),平均。 23.8 us,总计。 2.213 秒 (0.0%)
[性能] GlobalCallbacks:354737 个样本,峰值。 291 毫秒 (6080.2x),平均47.8 us,总计。 16.96 秒 (0.2%)
[性能] EditorAnalytics.Tick:24515个样本,峰值。 290 毫秒 (20095.9x),平均14.4 我们,总计。 353.7 毫秒 (0.0%)
[性能] GI.Tick:937 个样本,峰值。 860 us (22.1x),平均38.9 我们,总计。 36.46 毫秒 (0.0%)
[性能] Video.Update:354737 个样本,峰值。 306 us (403.3x),平均760 纳秒,总计。 269.5 毫秒 (0.0%)
[性能] UnitySynchronization.ExecuteTasks:4630 个样本,峰值。 6.44 毫秒 (899.0x),平均7.16 我们,总计。 33.14 毫秒 (0.0%)
[性能] Package.AsyncRequest:10 个样本,峰值。 108 us (8.9x),平均12.1 我们,总计。 121.0 我们 (0.0%)
[性能] PreloadManager:249203 个样本,峰值。 357 us (58.7x),平均。 6.08 我们,总计。 1.516 秒 (0.0%)
[性能] SceneTracker:354737 个样本,峰值。 2.12 秒 (6423.6x),平均330 我们,总计。 116.9 秒 (1.4%)
[性能] ConsoleLog.Tick:30117 个样本,峰值。 261 us (88.0x),平均2.97 us,总计。 89.44 毫秒 (0.0%)
[性能] HierarchyWindow.Tick:36792 个样本,峰值。 131 毫秒 (1620.4x),平均81.0 我们,总计。 2.979 秒 (0.0%)
[性能] Inspector.Tick:36784 个样本,峰值。 222 毫秒 (14.4x),平均15.4 毫秒,总计。 565.2 秒 (6.5%)
[性能] Tooltip.Tick:83723 个样本,峰值。 221 毫秒 (3980.2x),平均55.4 us,总计。 4.641 秒 (0.1%)
[性能] RequestRepaintForPanels:351040 个样本,峰值。 548 us (75.9x),平均7.22 我们,总计。 2.533 秒 (0.0%)
[性能] UpdateSceneIfNeeded:351040 个样本,峰值。 498 秒 (57935.4x),平均8.60 毫秒,总计。 3.019 秒 (34.9%)
[性能] UpdateVideoTextures:4105 个样本,峰值。 1.30 us (2.8x),平均460 纳秒,总计。 1.887 毫秒 (0.0%)
[性能] PackageImporter.Tick:30065 个样本,峰值。 320 us (540.3x),平均593 纳秒,总计。 17.82 毫秒 (0.0%)
[性能] InspectorBackground.Tick:38566 个样本,峰值。 198 us (244.3x),平均。 810 纳秒,总计。 31.23 毫秒 (0.0%)
[性能] ChangeLayoutIfNeeded:354737 个样本,峰值。 124 毫秒 (72989.2x),平均1.70 us,总计。 604.1 毫秒 (0.0%)
[性能] AsyncReadManager.ForceCloseFiles:6517 个样本,峰值。 11.7 毫秒 (1414.4x),平均8.26 我们,总计。 53.82 毫秒 (0.0%)
[性能] InactiveGI.Tick:1235 个样本,峰值。 977 us (24.5x),平均。 39.9 我们,总计。 49.28 毫秒 (0.0%)
[性能] RepaintAll:3697 个样本,峰值。 37.3 毫秒 (647.1x),平均57.7 us,总计。 213.4 毫秒 (0.0%)
[性能] AnimationWindow.OnGUI:41 个样本,峰值。 21.8 毫秒 (14.9x),平均1.46 毫秒,总计。 59.86 毫秒 (0.0%)
[性能] ConsolePro3Window.OnGUI:55 个样本,峰值。 158 毫秒 (34.7x),平均4.54 毫秒,总计。 249.8 毫秒 (0.0%)
解决方法
默认情况下,Unity(在其 32 位独立版本上)仅允许为每个玩家每个场景分配 4 GB 的 RAM。这意味着您不能在没有 Abort Trap 的情况下渲染超过 4 GB 的精灵(分配)。 32 位设备的实际实际限制(针对每个玩家的个人渲染)通常远低于阈值。由于以下原因,您可能需要 1.5 到 2 GB 的 RAM:
- 有限的地址空间
- 内存碎片
- GUI 和调试工具的异步渲染
如果可用,我首先建议安装 64 位 Unity 独立版。
如果您想要一个不涉及更新的解决方案:
为了解决这个问题,Unity 提供了一个名为 PackingTags/SpritePacker 的内置工具。您可以通过将精灵打包成层次结构来仅渲染场景中的内容。如果您离开场景,它们将不会被渲染。如果您不查看一组精灵(可能是因为世界没有完全渲染),那么您的 RAM 消耗将大大减少。在可能的情况下,绝对应该使用标签分组。这也减少了非联合(看起来像是游戏中的错误)。
回答您的问题:
-
要检查哪个资产给您带来了麻烦,请让我向您推荐 Unity 文档中的 Memory Profiler Module。 Profiler Module 显示系统的哪些部分用于哪些精灵渲染。如果您删除精灵并运行您的脚本(恐怕是一个一个地运行),这是一种蛮力且有保证的方法来检查哪些精灵正在滥用内存。
-
我认为 #1 的模块向您输出的结果将是您的系统需要的内存量(至少)。我会添加几百兆字节,让用户有机会决定他们的系统是否可以处理游戏。最小系统冻结会很糟糕。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。