情况:在程序生成我的游戏世界的最后,我留下了一块 2048 ^ 2 (~420万)大小的瓷砖堆栈。然后,我需要计算他的处理程序堆栈列表中的位置。这是我的方法:
public static final void addTile(Tile t){
for(int i = 0; i < sections.length; i++)
for(int j = 0; j < sections[i].length; j++)
if(sections[i][j].contains(t.x, t.y)){ //<-- determine which list according to tile's pos
world.get(i).get(j).get(TILE_LIST).push(t);
return;
}
}
有一个Rectangle[][]
与“世界”中的每个地点相对应。 arraylist
。如您所见,这是一个O(n^2)
循环,需要执行 420万次。即使 4个线程同时运行处理所有磁贴需要大约20秒。
这不是一个完全不可行的处理时间,但我认为必须有一个更好的算法。有什么建议吗?
答案 0 :(得分:2)
如MBo所提到的,r树是任意点/多边形搜索的良好空间索引,但是,由于我们正在寻找矩形(轴对齐的多边形),因此使用四叉树可能会更好(或3维中的八叉树。)
https://gamedev.stackexchange.com/questions/63536/how-do-shapes-rectangles-work-in-quad-trees
答案 1 :(得分:1)