2011-01-21 73 views
1

我正在使用图形引擎的关卡编辑器。最近,随着一个项目的扩展,我遇到了内存问题。特别是,这个级别非常大,需要加载大约300个不同大小的纹理。一些纹理像2048x2048那么大,其他像256x256或512x512更小。无论如何,编辑器会为此级别消耗1.3GB的内存,并且某些纹理因为抛出内存异常而无法加载。那么我在这里有什么解决方案?XNA内存中加载的纹理太多

现在,我能想到的唯一解决方案是根据可见区域将级别划分为更小的部分并根据需要加载纹理。但我相信这会在现场导航时大大减缓性能。有什么想法吗?关于这个问题,关卡编辑应该有一些标准的方法。

回答

3

你基本上有两种选择

  1. 切换到基于区块的方法。如果您使用瓷砖,那意味着您可以反复使用相同的纹理,从而节省大量的内存。
  2. 按照您所述切换到按需。

我在想,如果你的艺术方向并没有真正与基于瓦片的方法相结合,那么你就会开始考虑方法2。有几件事情要考虑

  • 它并不一定是缓慢的,只要你的“主动”区是足够大,这样你就不会通过加载过多捶打盘往往你应该罚款。
  • 衡量衡量尺度,你可能必须更好地掌握你的记忆预算,并设计你的水平,而不是设计你的水平,直到你碰壁。 :-)
  • 维护单独的内容管理器,请记住,您无法卸载通过contentmanager加载的单个内容片段,因此请保留一份管理员列表,以便在您移动时可以交换。
+0

首先,感谢您的回答。现在,虽然我不熟悉基于瓦片的方法,但是一个纹理可以被多个对象使用。它不会在使用它的每个对象的内存中多次加载。我想说明纹理保存在Dictionary 中。我不使用内容管理器,我使用Texture2D.FromFile加载纹理。我可以尝试按需求方式。使用内容管理器会保存任何内存吗?我想不是,所以我应该坚持已经实施的方法。 P.S我只负责这些工具,“测量”由其他人完成:) – muku 2011-01-21 15:16:46

+0

哦,我明白了......内容管理器实际上只是运行时代码,纹理贯穿内容管道。当你试图运行游戏时,我认为你的意思是你的内存不足。但是你描述的机制是相同的概念......存储对纹理的引用,以及在移动时加载/卸载。但要记住,要比屏幕略大一些,这样如果用户做小动作,就不必经常加载/重新加载。 – 2011-01-21 15:25:22

1

当你走近保持swaping它到128×128,256×256,512×512,等这可能是一个好主意,用不同品质的纹理效果的使用,如果你离我很远使用64×64的纹理,然后.. 。重新考虑使用2056x2056的纹理,因为它更好有4个贴图纹理:)。

(注:生成MIP-地图部分做到这一点,但不会在您的计算机上没有可用内存)

编辑:也尝试打开DXT5纹理压缩,这可能节省大量的记忆!