搜索每个对象的内存或所有图块块的内存哪个更快
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
具有 x
和 y
坐标。这仍将允许非常快速地查找对象,而不必按顺序扫描所有对象。
如果您实现自己的 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;
}
}
我有一个 100 x 100 二维网格的游戏。
我在一些方块中放置了物体。如果我希望用户能够从一个特定的方块中得到一些东西,是不是更好(少用 cpu)每次都搜索每个对象,或者为每个图块和一个对象数组创建一个对象,其中我可以使用 objectArray[x][y]
使用数组(或某种 HashMap)。这是一个 O(1) 访问。
如果您想在 O(1) 时间内找到一个对象,并且您在网格中有一个 (x,y)
对它的位置,那么没有什么比二维对象数组更好的了,因为没有进行搜索。按照现代标准,100×100 的网格很小,因此可以很好地利用内存来加快速度。
如果您想从一个对象开始并在网格上找到它的坐标,最快的方法是将坐标存储在对象本身上,假设一个对象在任何时候只能在一个正方形上。
你的100×100的网格比较小,二维数组就可以了。
如果您的网格很大且人烟稀少,Map<Point, MyObject>
是更好的解决方案,其中 Point
具有 x
和 y
坐标。这仍将允许非常快速地查找对象,而不必按顺序扫描所有对象。
如果您实现自己的 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;
}
}