我正在尝试在XNA中制作类似俄罗斯方块的游戏,目前我正在考虑以最佳方式处理它。
这是我到目前为止所做的: 我有一个名为Block的类,它具有例如纹理和颜色色调。
然后我计划将所有内容都放在双数组中,例如:
Block[,] blocks = new Block[10,20];
然后是完整的网格。
然后当积木向下移动时,我想这样做:
blocks[x,y+1] = blocks[x,y];
blocks[x,y] = null;
起初我认为这是一个好主意,但现在我一直在想我不太确定。它如何与内存一起工作?每次我这样做或者什么时候它会创建一个新对象吗?有人可以解释当我在一个数组中移动一个对象时它是如何工作的吗?
我并不是真的在寻找特定于俄罗斯方块的答案,我只是对它的实际效果感兴趣。
感谢。
答案 0 :(得分:2)
不,你只是在移动指针。当你说:
blocks[x,y+1] = blocks[x,y];
你实际上在做的是交换指针。该对象将保持精确的位置,但现在而不是它在索引x,y它将在x,y + 1的索引处。当你说
blocks[x,y] = null;
你要删除对象x,y的引用,如果没有其他东西拿着引用,垃圾收集器会清理它。
答案 1 :(得分:1)
上面的第一个答案几乎是正确的,但是赋值不是交换指针,而是重复它。在第一行代码之后,有两个对最初在块[x,y]处引用的对象的引用。空赋值会删除原始引用,但您仍然可以在块[x,y + 1]处生成新引用。 Null一个和堆对象将是GC的公平游戏。
答案 2 :(得分:0)
如果在数组中存储值类型(例如int,string),那么每次复制值时确实会创建数据的副本,因为值类型在C#中是不可变的。由于您在数组中存储了一个类(它是一个引用类型),因此您的代码实际上只是复制指针而不是整个对象。