XNA中非常长的Texture2D对象的缺点?

时间:2012-10-02 00:24:54

标签: xna xna-4.0

我使用Texture2D对象作为tileheet。它是一维的 - 一个瓷砖高,然而很多瓷砖很长。

我只是好奇是否有任何不利(除了更难编辑,我猜),让它们像这样摆放而不是更紧凑的方式,例如而不是64x1瓷砖,使其16x16。改变它并不是很难,但我想如果有一个长图像没有伤害,为什么还要烦恼呢?

2 个答案:

答案 0 :(得分:1)

拥有较长的图片可以让您更容易索引'表中的精灵。例如,在您的情况下,索引i处的图像位于坐标(w * i, 0)处,其中w是一个精灵的宽度。将它放在正方形中意味着您需要更复杂的数学来找到正确的精灵。它将在(w * (i % 16), h * (i / 16))。 (顺便说一句,这些坐标以像素为单位。)

所以使用长图像!它会让你的代码更清洁。

答案 1 :(得分:1)

唯一真正的缺点是,您将使用较少的精灵达到纹理的最大宽度(Reach配置文件中的2048,HiDef上的4096)。

这不是一个真正的问题,因为当它发生时,添加对更多行的支持是如此微不足道。


看到你提出这个问题,即使你几乎从不,也有一个一个模糊的,与性能相关的事情至少很有趣。需要担心它。

纹理的像素数据以逐行的顺序存储在CPU内存中。因此,如果您的图块是水平存储的,您可以尝试读取或写入单个图块的像素(即:GetDataSetData),您将访问许多小的,展开的内存部分。如果你垂直存储你的瓷砖,那么每个瓷砖将占用一大块内存 - 这具有更好的缓存一致性,并且可以用更少的操作复制(即:它更快)。

这是 GPU上的一个问题,其中纹理存储的布局使得所有附近的像素(不仅仅是左边和右边的像素)都存储在内存附近。