【发布时间】:2013-06-30 16:40:11
【问题描述】:
我正在尝试制作一款实时战略游戏,例如星际争霸或帝国时代。我的地图必须支持多达 1500 个实体。我的问题是如何在不滞后游戏的情况下实现战争迷雾。我最初尝试的方法是简单地计算一个单位每次移动时到所有周围区域的距离,但正如我预期的那样,这是滞后的,因为许多单位会不断移动。如果有人知道战争迷雾的更快算法,请提供帮助。地图将基于图块并存储在数组中。
【问题讨论】:
我正在尝试制作一款实时战略游戏,例如星际争霸或帝国时代。我的地图必须支持多达 1500 个实体。我的问题是如何在不滞后游戏的情况下实现战争迷雾。我最初尝试的方法是简单地计算一个单位每次移动时到所有周围区域的距离,但正如我预期的那样,这是滞后的,因为许多单位会不断移动。如果有人知道战争迷雾的更快算法,请提供帮助。地图将基于图块并存储在数组中。
【问题讨论】:
一个非常基本的实现可以如下:
可见性由每个图块(i,j) 的值v[i,j] 给出。任何低于某个阈值的值都在雾中。
使用以下两个步骤以定期时间步长更新值(注意:对于这种情况,除了非常特殊的情况外,不需要高精度或高频率):
v[i,j]
unit,将值v[unit_i, unit_j] 增加一个常数。您还可以添加一个恒定的数量如果一个单位在一个正方形上(不管它们有多少)。【讨论】:
[0,0,0,1,0,0,0],在一步之后看起来例如喜欢[0,0,0.25,1,0.25,0,0]。因此,根据阈值,您可以拥有一个可见的地图图块(单位所在的位置)或三个。模糊是一种在地图上“散布”单位而不实际计算距离的简单方法。
另一种解决方案:为您的实体分箱。
您创建了一个相对空闲的网格,甚至是一个四叉树。给定坐标(x,y),它允许您在log(d) 步骤中找到位于相同(或相邻)单元格中的所有实体,其中d 是您的四叉树的深度。
借助绳索(叶节点指向相邻单元的指针),可以在恒定时间内访问邻居。
要了解给定的地图图块是否可见,您只需查询四叉树即可。
此外,四叉树可能对与战争迷雾无关的其他任务有用。例如。你可能想找到离给定坐标(x,y)最近的“工人”,或者你想对一个地区的所有单位施加一些区域伤害。
【讨论】:
每当一个单位移动时,您可能会认为它会移动到相邻的图块,不是吗?在这种情况下,您还可以假设该单元的可见区域也沿同一方向移动一个格子,因此您应该可以轻松确定或更新应该可见的区域。根据单位的视线半径,仅更新需要更新的值可能会节省大量 CPU 资源。
问题应该是应该被模糊的区域 - 可以有更多的单位看到同一个图块,但这可以通过按照霍华德的建议来解决。
【讨论】: