如何有效地丢弃数组并用新值填充它

本文关键字:新值 填充 数组 有效地 | 更新日期: 2023-09-27 18:15:49

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

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

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

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
}

如何有效地丢弃数组并用新值填充它

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

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

如果你有很多工作需要30秒来设置,也许你可以做清理,而不是重新初始化所有的东西。

如果你选择放置null,你可能会抛出一些丑陋的异常,所以我认为你应该清理数组内的对象,而不是将它们设置为null

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

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

如果您将数组中的每个指针设置为null,垃圾收集器仍将执行相同数量的工作,并在稍后的时间清理这些n对象。唯一的区别是这里没有对数组进行回收,但是这一次的回收可以忽略不计。

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

但是,如果您的对象数量没有达到数千个,我想说您真的不会注意到性能的影响。

gameObjects = new MyClass[10,10];

…是要走的路。这肯定比循环遍历数组并将项设置为null要快。它也更容易编码和理解。但无论如何,这两种变体都非常快,除非您有数千万个条目!"[10,10]"非常小,所以忘掉表现,做对你来说更合适、更容易理解的事情。在大多数情况下,干净的代码比性能更重要。