最好创建一个空列表,或者在游戏中每帧处理大量对象时返回null?

时间:2016-07-05 22:06:33

标签: collections null processing

我基本上都在询问哪个CPU的成本更高。

情况是,在任何给定时间,我在屏幕上有大约40-400个粒子。每个粒子都有一个ParticleAI列表,它有一个Update()方法,返回一个新创建的粒子对象列表(如果有的话)。现在,由于这款游戏是针对移动设备制作的,因此处理器的效率至关重要。我想知道在每帧(60FPS)创建100-2000个列表之间的东西是否成本更高,这可能是空的,这是我现在的方式,或者返回空值并对每个AI进行空检查。出于某种原因,在我的大脑中,似乎构建一个List对象将花费更多的处理器时间,而不是简单地返回null然后对它进行布尔检查。我的假设错了吗?

我查看了其他类似的问题,例如this one,但它似乎没有回答我的问题。我得到的最佳做法是返回空,但我不是让其他任何人编辑这个游戏,所以我知道永远不会意外收到null。我需要知道纯处理术语哪个更好,只是因为一次创建了大量的粒子对象。

提前致谢!

编辑:

刚刚意识到可能更好的东西。是否更好的想法(而不是创建一个新列表并为每个每帧的每个粒子返回它)在构造时创建每个particleAI的返回列表,然后在每个Update()阶段的开始清除它?这似乎是最好的选择。

2 个答案:

答案 0 :(得分:0)

你真的不会得到一个最好的答案,因为没有一个。你做什么完全取决于你的背景。对于一个人编写一个程序,一种方法可能是最好的,但对于另一个人来说,完全不同的方法会更好。

我会说你所说的是object pool,这可能是开始研究的好地方。 Java(以及因此处理)已经将其用于IntegersStrings,这对您自己来说是非常合理的,特别是如果您的目标是移动设备。

要记住的另一件事是ArrayList在幕后使用数组。默认情况下,ArrayList为10个对象腾出空间,因此它会创建一个长度为10的数组。您可以通过使用占用容量的构造函数来更改此值。但是请记住,当你填充ArrayList时,它将为两倍的对象分配空间。因此,如果你的容量是10,当你点击10个对象时,它会创建一个容量为10的新数组。(这是非常一般的,但这是值得研究的另一件事。)

除此之外,您将不得不进行一些分析。在您开始询问这些类型的问题之前,您必须知道答案:您的对象占用了多少内存?他们需要多少处理时间?

创建一个简单的示例程序来测试这两种方法,然后进行一些压力测试以获得一些测量结果。但实际上,听起来你可能在找到问题之前就找到了问题。过早优化是万恶之源。

如果您确实发现每秒创建2000个List个实例60次太多,您可能还会考虑重构您的方法以减少密集度。我真的不明白为什么你需要为每个粒子提供多个Lists,所以可能有更有效的方法来实现你的目标。

答案 1 :(得分:0)

在共享对象时,重用相同的列表对象是行不通的。会涉及复制。

空列表还是空列表?假设您想要读取和写入列表,null似乎很难看。在java中,LinkedList会比ArrayList轻,所以选择一个链表。

Null会更快。只读,待替换的Collections.emptyList()会更安全一些。

考虑到算法方法,可能值得考虑其中一个方面的数据结构。花时间在正确的相关事情上。队列。优先级。