从应用上来说, 有两种:
探索范围: 通常在RPG游戏里, 用于标记走过的地图区域
视野范围: 通常在RTS游戏里, 用于标记友方单位可以看到的区域
当然, 在魔兽争霸3中, 两中迷雾都存在....下面以第二种为例详细说明, 第一种看完自然就明白怎么做了
好了, 既然是个可见性问题, 那么就有阻挡视线的地方和可以看到区域, 我们抽象一下, 把地图像寻路那样表示成二维格子
绿点代表有视野的单位, 红色区域代表视野阻挡...(比如去色)
原理其实看起来很简单, 这也是多数帖子和文章可以提到的, 但是实际做下来, 性能还是比较棘手的一个问题
目前来说, 我们在此基础上做了一些优化:
降低更新频率
如果游戏是30FPS的, 那么其实没有必要每帧都去计算这个可见性...针对于L=MAX的, 计算其可见的格子, 如果可见, 则格子的计数C加1
每个格子的可见计数C>0的表示可见, 否则就是不可见, 然后更新到纹理上
对于0的单位U全部不用计算, 所以不动的单位就不用更新...预计算FOV
如果视野阻挡不会变化的话, 可以针对每个点计算其最大视野范围的可见性信息, 缓存起来
如果用1bit表示每个格子, 最大视野范围20, 地图大小256x256个格子的话, 所需要的内存空间为