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