优化网格平铺地图中的视野算法

时间:2016-07-07 07:00:27

标签: javascript algorithm grid tiles

我正在尝试在我的游戏中实现Field of View算法,我在这里遵循了很棒的教程:sight-and-light这是我到目前为止所得到的:

enter image description here

你可以看到它适用于我:)

然后我尝试在平铺地图中使用此算法。它也工作正常,但只是有点慢,所以我现在正试图找到一种优化算法的方法。

某些信息可能有助于优化:

  • 平铺地图为正交
  • 所有瓷砖的尺寸均为32 * 32且为方形
  • 标记为0的瓷砖表示空标记为1表示障碍物
  • 我使用连接组件标签算法进行预处理:
    • 所有障碍已合并到多个地区
    • 我知道每个区域中的所有顶点位置

这样的事情:

enter image description here

假设我有9个连接区域(9个多边形)和40个顶点。

基于上述链接中的算法,将有:

  • ray-cast:40 * 3(每个顶点3个光线投射角度+ - 0.00001)
  • 边缘:40
  • edge * ray-cast intersection test:40 * 40 * 3 == 4800

我认为应该有一种方法可以减少在上述情况下我需要进行交叉计算的光线投射计数和边数,但是无法找到一个好的解决方案。

任何建议都将不胜感激,谢谢:)

1 个答案:

答案 0 :(得分:0)

您正在做的事情可以进行大量优化。 首先,没有必要使用所有顶点,也不需要进行任何相交测试。

取每个多边形。对于每个顶点,如果它是反转点,则计算出来。这是从原点/眼睛拍摄光线并检查邻居是否在同一侧。找出哪个方向朝向原点并跟随它直到找到另一个反转点。这些点之间的区段是面向原点/眼睛的区段。如果你有一个凸形,那里只有2个,对于更复杂的形状,可以有更多。

接下来将所有反转点转换为极坐标并按角度对它们进行排序。现在你应该有一堆可能重叠的间隔(注意扭曲360-> 0)。如果场景很简单,则间隔不重叠,因此您只需要使用灯光跟踪多边形(无需测试)。如果遇到重叠,请从现有间隔中取出反转点和当前边缘,并查看反转点是否与原点/眼睛位于同一侧。如果是这样,那么您可以将光线与当前边缘的反转点相交以获得远点并将其与反转点相关联,该反转点现在将替换为当前边缘。如果有一个不属于任何多边形的区间,则光线将变为无穷大(该多边形中的所有光线都无法看到)。

这适用于所有非重叠多边形。

所以在你的情况下,你只能获得9 * 2个反转点(你的多边形很简单),你需要做很少的边缘*光线交叉,因为它们的布局相当稀疏,并且算法很快就丢弃明显的非相交例。

如果这是针对某些实时应用程序,您可以通过利用反转点大部分保持相同的事实进一步优化它,如果它们发生变化,它们通常沿着多边形沿着一条边移动(如果是多边形小,移动距离大。)