【问题标题】:Unity3d Huge memory usage texturesUnity3d 巨大的内存使用纹理
【发布时间】:2014-09-24 21:22:21
【问题描述】:

我有一个内置于 Unity3D 中的 3D 无尽奔跑游戏,可在 iOS、Android 和 Windows Phone 上运行。

它在内存为 1014MB 及以上的 Windows Phone 上运行良好,但在此情况下它一启动就会崩溃(请参阅本文底部来自 Visual Studio 的错误消息)。

查看分析器我可以看到纹理的内存使用率非常高,例如我知道我在 Lumia 520 上最多只能获得 180MB 的 RAM,我可以从分析器中看到纹理单独占用 359MB,即使在第八分辨率(下面的截图),它们仍然占用 232MB!我已经完成了所有纹理,使其尽可能小和压缩,我在这里做错了什么吗?我怎样才能更多地了解哪些纹理存在问题?

我通常在游戏开始时将所有程序关卡元素预加载到内存中,以便在您运行后提高帧率,但即使我完全关闭它,内存使用也不受影响。

任何朝着正确方向的推动都会非常有帮助,谢谢!

Visual Studio 崩溃控制台日志转储:

'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: DefaultDomain): Loaded 'C:\windows\system32\mscorlib.ni.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Windows.RuntimeHost.ni.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Windows.ni.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Net.ni.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\windows\system32\System.ni.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Xml.ni.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\Data\Programs\{DFE540D3-80C1-4CFF-BFCA-CE252BC4EECE}\Install\EndlessRunner.DLL'. Symbols loaded.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\windows\system32\Microsoft.Phone.ni.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\windows\system32\Microsoft.Phone.Interop.ni.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\Data\Programs\{DFE540D3-80C1-4CFF-BFCA-CE252BC4EECE}\Install\WinRTBridge.DLL'. Cannot find or open the PDB file.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\Data\Programs\{DFE540D3-80C1-4CFF-BFCA-CE252BC4EECE}\Install\BridgeInterface.winmd'. Module was built without symbols.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\Data\Programs\{DFE540D3-80C1-4CFF-BFCA-CE252BC4EECE}\Install\UnityPlayer.winmd'. Module was built without symbols.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\windows\system32\WinMetadata\Windows.winmd'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Core.ni.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Runtime.ni.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Build from 'release/4.5/release' branch, version is '4.5.0f6 (fd4616464986)' (Release build).

Physical memory: 395 MB, commited memory limit: 180 MB.

PlayerConnection initialized from C:/Data/Programs/{DFE540D3-80C1-4CFF-BFCA-CE252BC4EECE}/Install/Data (debug = 0)

PlayerConnection initialized network socket : 0.0.0.0 55444

Multi-casting "[IP] 192.168.0.19 [Port] 55444 [Flags] 2 [Guid] 93005236 [EditorId] 1016877170 [Version] 1048832 [Id] WP8Player(192.168.0.19) [Debug] 0" to [225.0.0.222:54997]...

Direct3D:

    Version:  Direct3D 11.0 [level 9.3]

    Renderer: Qualcomm Adreno 305 (WDDM v1.2) (ID=0x30303330)

    Vendor:   Qualcomm

    VRAM:     96 MB

Initialize engine version: 4.5.0f6 (fd4616464986)

'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\Data\Programs\{DFE540D3-80C1-4CFF-BFCA-CE252BC4EECE}\Install\UnityEngine.DLL'. Cannot find or open the PDB file.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\Data\Programs\{DFE540D3-80C1-4CFF-BFCA-CE252BC4EECE}\Install\Assembly-CSharp-firstpass.DLL'. Cannot find or open the PDB file.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\Data\Programs\{DFE540D3-80C1-4CFF-BFCA-CE252BC4EECE}\Install\Assembly-CSharp.DLL'. Cannot find or open the PDB file.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\Data\Programs\{DFE540D3-80C1-4CFF-BFCA-CE252BC4EECE}\Install\BFSWP8Goodies.DLL'. Cannot find or open the PDB file.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\Data\Programs\{DFE540D3-80C1-4CFF-BFCA-CE252BC4EECE}\Install\GPGSUtils.DLL'. Cannot find or open the PDB file.
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded 'C:\Data\Programs\{DFE540D3-80C1-4CFF-BFCA-CE252BC4EECE}\Install\WinRTLegacy.DLL'. Module was built without symbols.
Could not allocate memory: System out of memory!
Trying to allocate: 1398128B with 32 alignment. MemoryLabel: Texture
Allocation happend at: Line:411 in C:/BuildAgent/work/aeedb04a1292f85a/Runtime/Graphics/Texture2D.cpp
Memory overview


[ ALLOC_DEFAULT ] used: 5715133B | peak: 5715181B | reserved: 6570457B 

[ ALLOC_GAMEOBJECT ] used: 43508B | peak: 43508B | reserved: 52731B 

[ ALLOC_GFX ] used: 155628390B | peak: 155628390B | reserved: 155631656B 

[ ALLOC_PROFILER ] used: 5028B | peak: 5028B | reserved: 12158B 

Could not allocate memory: System out of memory!
Trying to allocate: 1398128B with 32 alignment. MemoryLabel: Texture
Allocation happend at: Line:411 in C:/BuildAgent/work/aeedb04a1292f85a/Runtime/Graphics/Texture2D.cpp
Memory overview


[ ALLOC_DEFAULT ] used: 5715133B | peak: 5715181B | reserved: 6570457B 

[ ALLOC_GAMEOBJECT ] used: 43508B | peak: 43508B | reserved: 52731B 

[ ALLOC_GFX ] used: 155628390B | peak: 155628390B | reserved: 155631656B 

[ ALLOC_PROFILER ] used: 5028B | peak: 5028B | reserved: 12158B 


(Filename: C:/BuildAgent/work/aeedb04a1292f85a/Runtime/Allocator/MemoryManager.cpp Line: 909)


The program '[2540] TaskHost.exe' has exited with code -2147483645 (0x80000003).

【问题讨论】:

  • 好的,所以真正的问题是:您有多少纹理,它们的尺寸是多少,它们是否被压缩,您是否计算过分析报告的纹理内存使用量是否与计算相符?提示,对于未压缩的纹理,以字节为单位的大小为:宽度 * 高度 *(颜色位深度 / 8)= 字节。例如,一个 1024x1024x32 的未压缩纹理占用 4 MB 内存。如果将其降低到 16 色 bpp,它将是一半。
  • 经常在无尽的跑步游戏中使用对象池。我也在 3d 无尽的跑步者上工作,但还没有实现池化。但是,当游戏对象在玩家身后时,我会销毁它们。你也这样做吗?也许你生成了很多对象而不是销毁,所以这个问题发生了。

标签: memory windows-phone-8 unity3d textures


【解决方案1】:

我已经检查了每一个纹理,使其尽可能小和压缩,我在这里做错了什么吗?我怎样才能更多地了解哪些纹理存在问题?

嗯.. 我不认为你做错了什么。硬件的内存限制是硬件问题而不是艺术家问题。但是,艺术家必须应对限制才能应对硬件限制,那么:

  1. 如果您使用 3D,您可以:确保您的模型使用尽可能少的材料。模型上拥有的材料越多,此类模型最可能需要的单独纹理就越多。如果您仍然需要,请确保其他模型可以共享相同的材质(如果可能)或共享一些网格组,以便您可以优化绘图调用。

  2. 如果可以的话,使用 Atlas 纹理也很有帮助,因为它只考虑一种材质。那么它对你的记忆没有多大帮助,因为它仍然需要相同的记忆。它只会有助于对抗绘图调用。

  3. 就像 LearnCocos2D 所说的那样,每种颜色的位数是巨大的 *如果即使纹理“小”,也请尝试不使用 32 位纹理。

  4. 纹理分辨率或纹素是关键。如果您正在使用角色并且您的角色在移动屏幕上很小,那么您应该擅长使用非常小的纹理。例如,在某些游戏中,角色的高度为 6 英尺,而 8 英尺的墙在覆盖率方面被转换为 512x512px 纹理,例如墙壁部分中的一块砖块,与角色相比看起来相当不错。因此,例如,在这样的 8 英尺等高墙中与这样的角色相比更高将已经开始浪费资源,并且视觉影响将是最小的或根本不引人注意。为 3D 手机游戏定义纹素分辨率很重要,这样才能更好地规划纹理资源。

    如果可以的话,我向你推荐这个教程,它对这个问题非常有用:http://www.digitaltutors.com/tutorial/1772-Creating-Professional-Studio-Game-Assets-for-Production-in-3ds-Max-and-Unity

  5. 最后在你的情况下,因为它是无限的,你真的需要使用启用/禁用而不是破坏,并确保相机剔除的距离正是你需要的,否则你会加载很多不需要的玩家看不见的物体,这也可能是婴儿潮一代......只是说。

【讨论】:

    【解决方案2】:

    我确实经常在使用 Unity 制作的项目中看到内存使用问题。 完成纹理压缩设置等典型优化后,您可以尝试另一种方法。 最近,Unity 发布了一个名为 Addressables 的包。这将允许您在不加载资产的情况下保留对资产的引用。 在那里,何时加载/卸载它们取决于您。 我写了一篇关于它们的详细博客文章,它可能会对你有所帮助。 在https://thegamedev.guru/unity-addressables-learn-workflows/中找到它

    【讨论】:

      猜你喜欢
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      • 2013-05-15
      • 2011-01-13
      • 1970-01-01
      相关资源
      最近更新 更多