网络游戏的稀疏(伪)无限网格数据结构

时间:2011-11-13 04:48:44

标签: algorithm web-applications data-structures sparse-matrix

我正在考虑尝试制作一个基本上无限网格的游戏。

  • 网格非常稀疏。某些密度相对较高的小区域。相对较少的孤立非空细胞。
  • 使用的网格数量太大,无法实现天真,但可能因“大数据”标准而变小(我不是试图映射互联网或类似的东西)。
  • 这需要很容易坚持下去。

以下是我可能希望在此网格上执行的操作(合理有效):

  • 要求一些小的矩形区域的单元格及其所有内容(玩家当前的邻居)
  • 设置单个单元格或blit小区域(玩家正在移动)
  • 询问一些较大的矩形区域(世界地图或区域预览)的粗略形状或轮廓/轮廓
  • 查找具有大约给定密度的某些区域(玩家产卵位置)
  • 每跳最多一些小的恒定空格间隙的近似最短路径(经常可以做一个不好的近似,但不能继续朝错误的方向搜索)
  • 区域的近似凸包

这是一个问题:我想在网络应用程序中执行此操作。也就是说,我更愿意使用现有的数据存储(可能是关系数据库的形式)和相对较少的外部依赖(最好不需要持久的进程)。

伙计们,你能给我什么建议实际实现这个?如果没有网络应用程序限制,您将如何做到这一点?如果有的话,你会如何修改?

非常感谢大家!

1 个答案:

答案 0 :(得分:2)

我认为你可以像其他人建议的那样使用四叉树做任何事情,也许还有一些额外的数据结构。这里有更多细节:

  • 询问单元格内容,设置单元格内容:这些是基本的四叉树操作。
  • 粗糙的形状/轮廓:给定一个矩形,在四叉树中向下走足够多的步骤,大多数细胞都是空的,并使该级别的非空子系统变黑,其他的则为白色。
  • 具有近似给定密度的区域:如果您要查找的密度很高,那么我将维护地图中所有对象的单独索引。取一个随机对象并检查四叉树中该对象周围的密度。大多数物体将靠近高密度区域,仅仅因为高密度区域有许多物体。如果您拾取的物体附近的密度不是您要寻找的物体,请选择另一个。

    如果您正在寻找低密度,那么只需在地图上选择随机位置 - 假设它是稀疏地图,通常应该为您提供低密度点。再次,如果它不起作用,请再试一次。

  • 近似最短路径:如果这是一个不太频繁的操作,则创建一个粗略的图形,该区域位于起点A和终点B之间,用于某些合适的定义(可能是正方形包含以AB中点为中心,直径为1.5 * AB的圆,除非直径小于某个最小值,在这种情况下......实验)。制作与粗糙形状/轮廓相同的网格类型,然后创建(比如说)黑点的Delaunay三角剖分。在此图表上执行最短路径,然后将其覆盖在实际地图上,并根据实际地图优化路径。您可能需要在几个不同的细化级别重做 - 从一个非常粗略的图形开始,然后“放大”,从较高级别获得两个点作为起点和终点,并迭代。

    如果您需要经常这样做,您需要为整个地图维护这种类型的图形,而不是每次都重建它。但这可能很昂贵。

  • 近似凸包:再从粗糙的形状开始,然后采用黑点的凸包。

我不确定这是否容易放入关系数据库;基于文件的存储可以工作,但是将写操作与其他任何东西并发是不切实际的,如果你想让它增长到合理数量的玩家,你可能会想要它(每个世界/地图,如果有的话)是多个世界/地图)。我认为在这种情况下你可能最好保持一个单独的进程活着......即使这样,这使得正确地尊重多线程将是一个令人头疼的问题。