搜索每个对象的内存或所有图块块的内存哪个更快

which is faster a memory for a search through each object or a memory for all tile blocks

我有一个 100 x 100 二维网格的游戏。

我在一些方块中放置了物体。如果我希望用户能够从一个特定的方块中得到一些东西,是不是更好(少用 cpu)每次都搜索每个对象,或者为每个图块和一个对象数组创建一个对象,其中我可以使用 objectArray[x][y]

找到对象

使用数组(或某种 HashMap)。这是一个 O(1) 访问。

如果您想在 O(1) 时间内找到一个对象,并且您在网格中有一个 (x,y) 对它的位置,那么没有什么比二维对象数组更好的了,因为没有进行搜索。按照现代标准,100×100 的网格很小,因此可以很好地利用内存来加快速度。

如果您想从一个对象开始并在网格上找到它的坐标,最快的方法是将坐标存储在对象本身上,假设一个对象在任何时候只能在一个正方形上。

你的100×100的网格比较小,二维数组就可以了。

如果您的网格很大且人烟稀少,Map<Point, MyObject> 是更好的解决方案,其中 Point 具有 xy 坐标。这仍将允许非常快速地查找对象,而不必按顺序扫描所有对象。

如果您实现自己的 Point class,请记住实现 equals()hashCode(),例如像这样:

public final class Point {
    private final int x;
    private final int y;
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public int getX() {
        return this.x;
    }
    public int getY() {
        return this.y;
    }
    @Override
    public String toString() {
        return "(" + this.x + "," + this.y + ")";
    }
    @Override
    public int hashCode() {
        return this.x * 127 + this.y;
    }
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Point) {
            Point that = (Point) obj;
            return (this.x == that.x && this.y == that.y);
        }
        return false;
    }
}