gpt4 book ai didi

java - 迭代大量对象

转载 作者:行者123 更新时间:2023-12-01 12:56:26 25 4
gpt4 key购买 nike

我有一个 ArrayList,其中包含 40,000 个可以绘制到屏幕上的独立对象。现在,我必须遍历所有它们,并在它们显示在屏幕上时执行计算,然后再使用 Graphics2D 对象绘制它们。

for (GameObject object : gameObjects) {
if (insideScreenView(object)) {
object.draw(g2d);
}
}

这不会花费太长时间,但确实需要大约 2-5 毫秒。在任何给定时间,屏幕上仅显示大约 100 个此类对象。这意味着我运行了 39,900 次不必要的迭代。鉴于我知道大多数迭代不必发生,是否有更好的方法来做到这一点。

编辑:根据对象的边界矩形是否通过 Rectangleintersects() 方法与屏幕相交来选择在屏幕上显示的对象。

最佳答案

您不应迭代所有游戏对象,而应仅迭代可查看对象

那么,该怎么做呢?

->> 方法 1(慢,但简单)<<-

首先,将游戏逻辑分为两部分:updateView()draw()

  • updateView():在这里,您计算屏幕内有哪些对象,并将它们添加到一个简单的List中(您可以选择ArrayListLinkedList,每一项都会有不同的性能影响,因此,对它们进行基准测试!)。

  • 绘制():在这里,您将迭代之前在 updateView 上创建的 List 上的所有对象,并绘制它们。

->> 方法 2(快速,但复杂)<<-

基本逻辑有点像方法 1:将可查看的对象放在 List 中,并使用 draw() 方法绘制它们。但这些方法之间的区别在于,在此方法中,您检查对象何时移动,而不是每次勾选都验证哪些对象是可见的。

根据您的游戏对象的管理方式,方法 1 可能会更快(如果您的游戏对象每次都在移动,例如粒子),但对于一般用途, 此方法更快

因此,在游戏对象内部,您添加一个名为 addedToViewList 的 boolean 值。这个 boolean 值指示对象是否添加到可查看对象列表中,因此我们不需要使用list.contains(object)并对其进行迭代。然后,每次勾选时,您都会检查该对象是否已在列表中。如果是,您检查他是否可见:如果不是,您从列表中删除他。如果他不在列表中,但可以查看,那么您他添加到列表中。

示例:

public void onMove() {
if (addedToViewList && !insideScreenView()) {
this.addedToViewList = false;
(view list).remove(this);
}
else if (!addedToViewList && insideScreenView()) {
this.addedToViewList = true;
(view list).add(this);
}
}

希望对你有帮助。再见!

关于java - 迭代大量对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23848274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com