我正在考虑尝试制作一个基本上无限网格的游戏。
以下是我可能希望在此网格上执行的操作(合理有效):
这是一个问题:我想在网络应用程序中执行此操作。也就是说,我更愿意使用现有的数据存储(可能是关系数据库的形式)和相对较少的外部依赖(最好不需要持久的进程)。
伙计们,你能给我什么建议实际实现这个?如果没有网络应用程序限制,您将如何做到这一点?如果有的话,你会如何修改?
非常感谢大家!
答案 0 :(得分:2)
我认为你可以像其他人建议的那样使用四叉树做任何事情,也许还有一些额外的数据结构。这里有更多细节:
具有近似给定密度的区域:如果您要查找的密度很高,那么我将维护地图中所有对象的单独索引。取一个随机对象并检查四叉树中该对象周围的密度。大多数物体将靠近高密度区域,仅仅因为高密度区域有许多物体。如果您拾取的物体附近的密度不是您要寻找的物体,请选择另一个。
如果您正在寻找低密度,那么只需在地图上选择随机位置 - 假设它是稀疏地图,通常应该为您提供低密度点。再次,如果它不起作用,请再试一次。
近似最短路径:如果这是一个不太频繁的操作,则创建一个粗略的图形,该区域位于起点A和终点B之间,用于某些合适的定义(可能是正方形包含以AB中点为中心,直径为1.5 * AB的圆,除非直径小于某个最小值,在这种情况下......实验)。制作与粗糙形状/轮廓相同的网格类型,然后创建(比如说)黑点的Delaunay三角剖分。在此图表上执行最短路径,然后将其覆盖在实际地图上,并根据实际地图优化路径。您可能需要在几个不同的细化级别重做 - 从一个非常粗略的图形开始,然后“放大”,从较高级别获得两个点作为起点和终点,并迭代。
如果您需要经常这样做,您需要为整个地图维护这种类型的图形,而不是每次都重建它。但这可能很昂贵。
近似凸包:再从粗糙的形状开始,然后采用黑点的凸包。
我不确定这是否容易放入关系数据库;基于文件的存储可以工作,但是将写操作与其他任何东西并发是不切实际的,如果你想让它增长到合理数量的玩家,你可能会想要它(每个世界/地图,如果有的话)是多个世界/地图)。我认为在这种情况下你可能最好保持一个单独的进程活着......即使这样,这使得正确地尊重多线程将是一个令人头疼的问题。