2

我在一个简单的 WinForms 游戏中使用了一些全局数组。新游戏开始时初始化数组。当玩家处于游戏中间时(数组中充满了数据),他点击 StartNewGame() 按钮(重新开始游戏)。接下来做什么?

是否可以为新游戏重新初始化整个数组,或者我应该将每个数组项设置为 null 并使用已经初始化的数组(这会更慢)?

我的意思是可以做这样的事情吗?

MyClass[,] gameObjects;

public Form1()
{
   StartNewGame();

   // game flow .. simplified here .. normally devided in functions and events.. 

   StartNewGame();

   // other game flow
}

public StartNewGame()
{
   gameObjects = new MyClass[10,10];

   // some work with gameObjects
}
4

4 回答 4

1

这几乎完全取决于MyClass,特别是它包含多少数据成员,它的构造函数(和成员的构造函数)需要多少处理,以及将此类的对象(重新)设置为“初始化”状态是否是一个相对简单的操作. 通过对标可以得到更客观的答案。

于 2013-05-28T17:31:04.037 回答
0

如果您的示例中只有 100 个元素,那么应该不会有明显的性能影响。

如果您重新初始化数组,您将执行对象的n构造n。垃圾收集器将在稍后清理旧数组并取消分配这些旧n对象。(所以你有n预先n分配,并由 GC 释放)。

如果您将数组中的每个指针都设置为nulln ,垃圾收集器仍将做相同数量的工作,并在稍后清理这些对象。唯一的区别是您没有在此处解除分配数组,但单个解除分配可以忽略不计。

从我的角度来看,在这种情况下实现性能的最佳方法是根本不重新分配对象,而是使用相同的对象。添加一个valid bit来标记一个对象是否有效(正在使用),并重新初始化您只需将所有设置valid bits为 false。以类似的方式,程序不会在不使用时将 0 写入所有内存。他们只是将其保留为垃圾并根据需要覆盖数据。

但同样,如果您的对象数量没有达到数千个,我会说您真的不会注意到性能下降。

于 2013-05-28T17:36:53.497 回答
0
gameObjects = new MyClass[10,10];

...是要走的路。这绝对比遍历数组并将项目设置为空要快。它也更容易编码和理解。但是无论如何,这两种变体都非常快,除非您有数千万个条目!'[10, 10]' 非常小,所以忘记性能,做你认为更合适和更容易理解的事情。在大多数情况下,干净的编码比性能更重要。

于 2013-05-28T17:37:09.367 回答
0

从你的问题,我知道没有那么多数组 - 在这种情况下,我会说,重新初始化整个数组

如果您有很多工作可能需要 30 秒来设置,那么您可能会进行清理而不是重新初始化所有内容。

如果你选择放置 null,你可以喷射一些丑陋的异常,所以我认为你宁愿清理数组内的对象,而不是将它们设置为 null

于 2013-05-28T17:32:40.280 回答