在XNA中使用多个基于Texture2D的切片的内存使用情况

时间:2012-02-15 16:58:28

标签: c# xna-4.0

已经开始编写一个简单的tile滚动例程。我需要每个瓷砖都有一个纹理,有几个“框架”用于动画目的。由于所有的图块都使用相同的图像,我担心内存使用情况。由于每个tile类都使用Texture2D,这是否意味着每个tile实例都有一个图像副本,或者Texture2D中的纹理是一个返回单个纹理的引用?我有42个瓷砖,我不想在内存中有42个相同图像的副本,因为这会浪费。我想要的是42个瓦片引用单个图像作为Texture2D。这是可能的还是我应该以不同的方式处理这个问题?

3 个答案:

答案 0 :(得分:0)

在C#中,它是正常的,因此基本数据结构具有by值传递,这意味着该值被复制到新的存储区域。受影响的数据类型只是基本类型,如string,int,float等。

但是当你有一个对象并将其作为值或参数传递或者只是对另一个var进行赋值时,不会复制整个对象。相反,目标对象获取旧对象的内存中的地址,并将其存储为自己的对象,但仍然是原始对象。

要将对象复制或分配到新的存储空间,请使用CopyTo() - Method。

答案 1 :(得分:0)

Texture2d引用gpu中的纹理,如果需要,可以在图形内存中保存两次相同的纹理,但这种行为是不可取的,因此xna提供了一个内容管理器来避免重复。

如果使用Content.Load(asset)加载资产纹理,内容会加载它,并保存对新texture2d对象的引用,因此下次加载该资源纹理时,它将返回创建的相同texture2d引用之前。

因此,您只需使用内容管理器即可避免重复。

答案 2 :(得分:0)

我不太明白这个问题,但我相信您可能想看看使用纹理图集...例如,查看http://rbwhitaker.wikidot.com/texture-atlases-2