前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >游戏中的战争迷雾

游戏中的战争迷雾

作者头像
逍遥剑客
发布于 2018-05-21 03:40:27
发布于 2018-05-21 03:40:27
3.1K3
举报

说到战争迷雾(Fog of War, FOW), 其实还是非常普遍的一项技术, 在RPG, RTS等游戏中得到了广泛的应用 

但是关于这方面的资料非常少, 经常会有人问怎么做, 所以就有了写这篇文章的想法

从应用上来说, 有两种:

  • 探索范围: 通常在RPG游戏里, 用于标记走过的地图区域
  • 视野范围: 通常在RTS游戏里, 用于标记友方单位可以看到的区域

当然, 在魔兽争霸3中, 两中迷雾都存在. 下面以第二种为例详细说明, 第一种看完自然就明白怎么做了

好了, 既然是个可见性问题, 那么就有阻挡视线的地方和可以看到区域, 我们抽象一下, 把地图像寻路那样表示成二维格子

绿点代表有视野的单位, 红色区域代表视野阻挡, 那么白色区域就是可见的, 灰色就是不可见的

求解这个可以与不可见区域的问题, 其实就是一个FOV(Field of Vision, Field of View)问题, 算法上来说, 五花八门, 参见[1]

有了这个可见性的区域信息, 怎么绘制到场景里呢? 

既然可以表示成一个二维数组, 那么就可以把这些信息写入一张2D纹理, 然后把这个纹理投影到整个地图(不管3D还是2D, 原理一样)

那么, 纹理会不会太大? 按我们的经验来讲, 一般一米一个格子的精度是完全够用的, 256x256的大小可以适用于大多数的游戏

如果嫌锯齿太难看, 做个模糊就行了. 3D游戏中更是可以在shader中针对视野内和视野外使用不同的着色方式(比如去色)

原理其实看起来很简单, 这也是多数帖子和文章可以提到的, 但是实际做下来, 性能还是比较棘手的一个问题

目前来说, 我们在此基础上做了一些优化:

  • 降低更新频率
    • 如果游戏是30FPS的, 那么其实没有必要每帧都去计算这个可见性. 经验值的话, 0.5秒一次差不多
    • 由此带来的跳变问题, 可以保存相邻再次计算的结果, 写入迷雾纹理的两个通道, 在shader中按时间进行插值过渡
  • 大量移动单位和大视野不动单位[2][3]
    • 这个用个循环暴力计算显然不现实, 除非你地图很小-_-. 所以, 优化思路就是针对移动的单位重新计算, 针对不动的单位只算一次
    • 首先, 我们可以用坐标(X,Y)和视野半径(R)三个值确定出一个唯一值K代表一个提供视野的单位U
    • 对于每帧新加入(K当前不存在)的U, 定义其生命周期L=MAX. 其余的就对U的L进行递减
    • 移除L<=0的U. 针对于L=MAX的, 计算其可见的格子, 如果可见, 则格子的计数C加1
    • 每个格子的可见计数C>0的表示可见, 否则就是不可见, 然后更新到纹理上
    • 对于0<L<MAX的单位U全部不用计算, 所以不动的单位就不用更新
  • 预计算FOV
    • 如果视野阻挡不会变化的话, 可以针对每个点计算其最大视野范围的可见性信息, 缓存起来
    • 如果用1bit表示每个格子, 最大视野范围20, 地图大小256x256个格子的话, 所需要的内存空间为41x41x256x256bit=13.13MB, 如果再剔除掉视野阻挡内的点, 应该更小

另外, 对于小地图, 正好可以把迷雾纹理与背景直接混合, 做到二次利用

对于探索范围的表示, 其实只要在格子的计数器上做点手脚就好了

YY一下, 3D的体积迷雾是不是可以用Volumn纹理实现:)

参考资料

[1]http://roguebasin.roguelikedevelopment.org/index.php?title=Category:FOV

[2]http://www.gamedev.net/topic/530346-efficient-fog-of-war/

[3]http://www.gamedev.net/topic/549305-fast-fog-of-warexploring-in-rts/

[4]http://www.gamedev.net/topic/615615-line-of-sight-in-tiles-base-map-fog-of-war/

[5]https://code.google.com/p/libfov/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013年10月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
3 条评论
热度
最新
谢谢分享!
谢谢分享!
回复回复点赞举报
很好的技术文章,讲解了迷雾的设置
很好的技术文章,讲解了迷雾的设置
回复回复点赞举报
沙发,第一个,^_^
沙发,第一个,^_^
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
让游戏AI学会开挂
在大型竞技电子游戏中,越来越多的研究人员开始让AI学习人类高手的操作。一般来说,利用强化学习等训练方法,使用大量数据集训练模型,让AI在即时战斗中学会执行下一步的操作。
算法一只狗
2022/11/04
7930
硬核干货丨游戏大世界的超远视距处理手法,建议收藏!
| 导语   本文从浮点数精度、实时阴影、合批策略和剔除算法四方面阐述游戏大世界的超远视距处理的常用手法。 当世界足够大的时候,浮点数的精度问题就会呈现出来。浮点数的精度可能带来的问题可谓五花八门,如模型之间出现接缝和穿插、光照计算出现溢出变黑、骨骼动画出现抖动等。如果你在半精度Shader开发中没碰到过这类问题,那不是你的算法太优秀,就是你还没被现实所教育。 位置和计算精度问题 一般来说,在CPU端,游戏中的数学库大多是基于32位浮点数构建,常用的如向量运算、矩阵运算、开方求幂、三角函数、BVH划
腾讯大讲堂
2020/10/21
2.7K0
如何使用MapTool构建交互式地牢RPG 【Gaming】
在上一篇关于MapTool的文章中,我解释了如何下载、安装和配置您自己的私有开源虚拟桌面,以便让您和您的朋友可以一起玩角色扮演游戏(RPG)。MapTool是一个复杂的应用程序,具有许多特性,本文将演示游戏大师(GM)是如何充分利用它的。
五月Rambo
2019/11/11
4.6K0
如何使用MapTool构建交互式地牢RPG 【Gaming】
人类玩 DOTA2 能赢,是因为 AI 是暴雪爸爸教的
今天,DOTA2 全球顶级赛事 Ti8(The International DOTA2 Championships)淘汰赛进入到第三日,除了惋惜中国战队 VG 遗憾出局之外。之后举行的 OpenAIFive 大战Pain 战队则成了一大亮点,不同于上次 OpenAI 大败 Dendi,这一次 OpenAIFive 首场以败北告终,人类战队似乎又看到了一点希望。
HyperAI超神经
2019/11/29
7050
通过奖励随机化发现多智能体游戏中多样性策略行为,清华、UC伯克利等研究者提出全新算法RPG
在法国启蒙思想家卢梭(Jean-Jacques Rousseau)的《论人类不平等起源》中,提到这样一个猎鹿(StagHunt)故事:一群猎人安静地在陷阱旁等待鹿的出现,猎到鹿的收益较大,可以让所有猎人都吃饱,但是由于鹿十分机敏,需要大家都耐心等待。这个时候一只兔子出现了,兔子体型较小,一人便可以成功捕猎,但是相应的收益也很小。
机器之心
2021/03/15
3750
通过奖励随机化发现多智能体游戏中多样性策略行为,清华、UC伯克利等研究者提出全新算法RPG
DeforGAN:用GAN实现星际争霸开全图外挂!
本文提出了 DefogGAN,这是一种推断即时战略(Real-Time Strategy,RTS)游戏中战争迷雾后的隐藏信息状态的生成式方法。给定一个部分可观测的状态,DefogGAN 可以将游戏的去雾图像作为预测信息生成。这样的信息可以创造战略智能体。DefogGAN 是一种条件 GAN 的变体,它使用了金字塔重建损失,从而在多个特征分辨率尺度上进行优化。本文使用一个大型专业的星际争霸录像数据集验证了 DefogGAN。结果表明 DefogGAN 可以预测敌方建筑物和作战单位,准确率与职业玩家相当,并且比当前最佳的去雾模型的性能更好。
机器之心
2020/04/07
1.1K0
DeforGAN:用GAN实现星际争霸开全图外挂!
Github霸榜:从零开始学3D着色器编程
Shader,是运行在GPU上的程序,中文称为着色器。它的主要用途是对三维物体进行着色处理,对光与影进行计算,以及控制纹理颜色的呈现等,最终,将游戏引擎中的几何数据转化为屏幕上的模型、场景以及特效。
新智元
2019/05/17
2.2K0
Github霸榜:从零开始学3D着色器编程
走进 VR 游戏开发的世界
背景介绍 笔者在2014年下半年尝试开发了一款 XboxOne 平台的体感游戏, 2015年进行收尾工作的同时, 结合之前积累的体感交互经验, 开始进行 VR 游戏的预研工作. 在这近一年的时间里, 一方面从外界感受到了一股虚拟现实快速发展的潮流, 另一方面也体会到身边很多人对 VR 游戏的了解非常有限. 现在我们自己的 VR 游戏 Demo 已经完结, 技术上验证了在当前的硬件条件下, 开发高画质游戏的可行性. 当然, 优质的 VR 游戏需要大家共同的努力, 我们也希望更多的人参与进来. 在此把我们在开发
腾讯Bugly
2018/03/23
1.1K0
走进 VR 游戏开发的世界
什么是draw call_unity drawcall优化
draw call是openGL的描绘次数(directX没怎么研究,但原理应该差不多) 一个简单的openGL的绘图次序是:设置颜色→绘图方式→顶点座标→绘制→结束。 每帧都会重复以上的步骤。这就是一次draw call
全栈程序员站长
2022/10/02
1.4K0
过亿月流水H5游戏优化分享、腾讯自研H5游戏优化分享、Layabox官方优化分享,全在这里了!
讲到优化,嘉宾们几乎都会提到优化与调试工具,掌握工具是性能优化的基础。那么都有哪些工具呢?常用的有三个:
Layabox Charley
2019/05/10
2.7K0
过亿月流水H5游戏优化分享、腾讯自研H5游戏优化分享、Layabox官方优化分享,全在这里了!
游戏人工智能 读书笔记(十一)游戏内容生成
说到最早使用算法来生成地图的游戏,或许就是1973年的Maze War[1]这款游戏了。在游戏中,玩家以第一人称视角操控,在一个迷宫里面游荡,时而会遇到敌人进行战斗。虽然以现在人的眼光来看,Maze是款简单粗糙的游戏,但它很大程度上影响了后续第一人称射击游戏的发展;并且也开启了算法生成游戏地图的新纪元。对于那个年代就已经接触计算机的天才们,随手写一份随机迷宫生成算法自然是信手拈来;而对于如今每天接触互联网的我们,如果想写一份类似的随机生成算法,只要在Google上搜“Maze generation algorithm”也就可以了。
大喵呼
2018/07/03
1.4K0
A*寻路初探(转载)
译者序:很久以前就知道了A*算法,但是从未认真读过相关的文章,也没有看过代码,只是脑子里有个模糊的概念。这次决定从头开始,研究一下这个被人推崇备至的简单方法,作为学习人工智能的开始。 这篇文章非常知名,国内应该有不少人翻译过它,我没有查找,觉得翻译本身也是对自身英文水平的锻炼。经过努力,终于完成了文档,也明白的A*算法的原理。毫无疑问,作者用形象的描述,简洁诙谐的语言由浅入深的讲述了这一神奇的算法,相信每个读过的人都会对此有所认识(如果没有,那就是偶的翻译太差了--b)。 原文链接:http://www.gamedev.net/reference/articles/article2003.asp以下是翻译的正文。(由于本人使用ultraedit编辑,所以没有对原文中的各种链接加以处理(除了图表),也是为了避免未经许可链接的嫌疑,有兴趣的读者可以参考原文。
冰封一夏
2019/09/10
1.3K0
A*寻路初探(转载)
科普:零基础了解3D游戏开发
学习最大的障碍就是未知,比如十八般兵器放在你面前都认不出来,又谈何驰骋沙场。更何况3D游戏开发本就是一个门槛不低的工作。本篇抛开引擎的结构,本着初次认知3D游戏世界的逻辑,让没有3D基础的开发者,通过本篇文章,对LayaAir 3D引擎的基础功能以及3D基础概念有一个概览性认识。
Layabox Charley
2019/11/06
9.6K0
科普:零基础了解3D游戏开发
物理画线“救救小鸡”,支持自建关卡!技术教程分享
引言:Cocos 微店 12.12 ~ 12.14 双12特惠来袭,5.x 折优惠 + 店铺公开优惠券(每天100张)。如果你错过了双11,请不要再错过双12啦!
张晓衡
2023/02/23
2K0
物理画线“救救小鸡”,支持自建关卡!技术教程分享
追梦 40 年:一位男子的 8 位 Commodore 64 角色扮演游戏之旅
相关链接:https://arstechnica.com/gaming/2023/06/one-mans-40-year-8-bit-quest-to-finish-the-c64-rpg-he-st
明明如月学长
2023/07/10
2210
追梦 40 年:一位男子的 8 位 Commodore 64 角色扮演游戏之旅
玩玩webgame开发(4):游戏数据结构设计[通俗易懂]
很久没做更新了。最近比较忙碌,手头的webgame也都放下。最近很想念我的小webgame了,回来继续写。
全栈程序员站长
2022/09/05
4540
Godot3游戏引擎入门之零一:【翻译】为什么要选择 Godot 引擎
2018-08-24 by Liuqingwen | Tags: Godot 翻译 | Hits
IT自学不成才
2019/01/07
2.6K0
地形分析的主要内容(流浪地球的特效水平)
场景的一些基本信息,包括Light,SkyDome,环境光,雾以及场景中静态模型StaticEntity等。摘录部分文件如下:
全栈程序员站长
2022/07/30
3400
地形分析的主要内容(流浪地球的特效水平)
《Unity Shader入门精要》笔记:基础篇(1)
小插曲:看到具体数学冷汗直冒,细一看,嗷不是那本书呀。《具体数学》:别听《Unity Shader入门精要》里面说什么程序员的三大浪漫,真程序员就该手撕《具体数学》!
[Sugar]
2022/09/21
1.1K0
Unity手游实战:从0开始SLG——世界地图篇(十一)AOI
AOI的全称叫Area Of Interest,感兴趣的区域。这个技术可以看做是服务器广播的一种。在MMO类型的游戏里是必须存在的。
放牛的星星
2020/07/10
4.3K0
Unity手游实战:从0开始SLG——世界地图篇(十一)AOI
推荐阅读
相关推荐
让游戏AI学会开挂
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档