Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 遍历大量对象_Java_Performance - Fatal编程技术网

Java 遍历大量对象

Java 遍历大量对象,java,performance,Java,Performance,我有一个ArrayList,其中有40000个单独的对象可以绘制到屏幕上。现在,我必须遍历所有这些对象,并在使用Graphics2D对象绘制它们之前,如果它们显示在屏幕上,则执行计算 for (GameObject object : gameObjects) { if (insideScreenView(object)) { object.draw(g2d); } } 这并不需要太长时间,但需要大约2-5毫秒。在任何给定时间,屏幕

我有一个
ArrayList
,其中有40000个单独的对象可以绘制到屏幕上。现在,我必须遍历所有这些对象,并在使用
Graphics2D
对象绘制它们之前,如果它们显示在屏幕上,则执行计算

for (GameObject object : gameObjects) {
        if (insideScreenView(object)) {
            object.draw(g2d);
        }
    }
这并不需要太长时间,但需要大约2-5毫秒。在任何给定时间,屏幕上只显示大约100个这样的对象。这意味着我正在运行39900次不必要的迭代。考虑到我知道大多数迭代不必发生,有没有更好的方法来实现这一点

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

而不是迭代所有游戏对象,您应该只迭代
可查看的对象

那么,如何做到这一点呢


->>方法1(缓慢但简单)方法2(快速但复杂)您能告诉我们更多关于您如何知道选择哪些对象的信息吗?我看到的唯一方法是实现第二个数组,其中包含可在屏幕上绘制的对象。也许在你对对象做了一些事情之后,在你的核心游戏循环中检查是否
insideScreenView
如果是,然后将其添加到可绘制数组中。也许如果你发布insideScreenView代码,我们可以看到它,看看是否可以改进。(P.S为什么insideScreenView不是GameObject的一种方法?)显然,这在计算机图形学中得到了广泛的研究。搜索平截体剔除。。。它通常需要一些加速数据结构,如BVH或kd tree。@Marcacierno
insideScreenView()
是对
screenRect.intersects(object.getRect())
的单个调用。其中
screenRect
是一个
矩形
,用于保存游戏中摄像机的位置。它是根据这个问题实现的:通常在游戏中摄像机一直在移动。这使得方法2不是一个很好的主意。是的,正如我所说的,根据游戏对象的管理方式,方法1可以而且将会更快。你能解释一下如何计算屏幕上的对象吗。这怎么会比每次平局时的计算速度快呢?与您现在的计算方法相同。和我一起想一想:什么更快,验证40000个对象中的每一个是否都在屏幕上,或者计算每个对象是否仅在移动时才在屏幕上?
public void onMove() {
  if (addedToViewList && !insideScreenView()) {
    this.addedToViewList = false;
    (view list).remove(this);
  }
  else if (!addedToViewList && insideScreenView()) {
    this.addedToViewList = true;
    (view list).add(this);
  }
}