Memory Unity3d使用大量内存纹理

Memory Unity3d使用大量内存纹理,memory,windows-phone-8,unity3d,textures,Memory,Windows Phone 8,Unity3d,Textures,我有一款内置Unity3D的3D无止境跑步者游戏,在iOS、Android和Windows Phone上运行 它在内存为1014MB及以上的Windows手机上运行良好,但在这种情况下,它一启动就会崩溃。请参阅本文底部Visual Studio的错误消息 查看分析器,我可以看到纹理的内存使用率非常高,例如,我知道Lumia 520上的最大内存只有180MB,我可以从分析器中看到纹理单独占用359MB,即使在下面的八分辨率屏幕截图中,它们仍然占用232MB!我已经通过了每一个纹理,使它尽可能小和压

我有一款内置Unity3D的3D无止境跑步者游戏,在iOS、Android和Windows Phone上运行

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

查看分析器,我可以看到纹理的内存使用率非常高,例如,我知道Lumia 520上的最大内存只有180MB,我可以从分析器中看到纹理单独占用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).
我已经通过了每一个纹理,使它尽可能小和压缩,我在这里真的做错了什么吗?如何进一步了解纹理是什么问题

哼。。我不认为你做错了什么。硬件上的内存限制是硬件问题,而不是艺术家问题。然而,为了能够应对硬件限制,艺术家必须应对限制,然后:

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

如果可以的话,使用Atlas纹理也很有帮助,因为它只被认为是一种材质。那么它对你的记忆没有多大帮助,因为它仍然需要相同的记忆。这只会对抽签有帮助

就像LearnCos2D所说的,每种颜色的比特数是一个巨大的数字。如果纹理很小,试着不要使用例如32比特的纹理

纹理分辨率或纹理是关键。如果你正在使用一个角色,并且你的角色在移动屏幕上很小,那么你应该擅长使用非常小的纹理。例如,在某些游戏中,角色的高度为6英尺,8英尺高的墙壁被转化为512x512px纹理,例如墙壁部分的砖块覆盖率,与角色相比看起来相当好。因此,例如,在这样一堵8英尺高的墙中,与这样的人物相比,走得更高已经开始浪费资源,视觉冲击将是最小的,或者根本不明显。为3D移动游戏定义纹理分辨率非常重要,这样可以更好地规划纹理资源

如果可以的话,我向您推荐本教程,它提供了关于以下问题的信息:

最后,在你的情况下,因为它是一个无限的你真的需要使用启用/禁用,而不是销毁,并确保相机剔除的距离正是你所需要的,否则你会加载很多球员看不见的对象没有需要,这可能是一个婴儿潮太多了。。。只是说说而已


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

中找到它好的,那么真正的问题是:你有多少纹理,它们的尺寸是多少,它们被压缩了吗?你有没有计算过通过分析报告的纹理内存使用情况是否与计算结果相匹配?提示,对于未压缩的纹理,以字节为单位的大小为:宽度*高度*颜色位深度/8=字节。例如,1024x1024x32未压缩纹理占用4 MB内存。如果你把它减少到16色bpp,它将是原来的一半。在无休止的跑步者游戏中,经常使用对象池。我也在使用3d无止境跑步器,但还没有实现池。但是,当游戏对象在玩家身后时,我会销毁它们。你也这么做吗?也许您正在生成大量对象,而不是销毁,所以发生了此问题。