`
aigo
  • 浏览: 2674701 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

RTS游戏中的战争迷雾原理

 
阅读更多

原文:http://blog.csdn.net/xoyojank/article/details/12259161

 

说到战争迷雾(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纹理实现:)
 
参考资料
  • 大小: 775.2 KB
  • 大小: 546.9 KB
  • 大小: 12.7 KB
  • 大小: 61.6 KB
  • 大小: 12.7 KB
  • 大小: 12.9 KB
分享到:
评论

相关推荐

    RealTek RTS5411主控方案USB HUB官方原理图

    在RealTek RTS5411主控方案USB HUB官方原理图中,功率管理是通过power option 1、power option 2、power option 3和power option 4来实现的。 接口设计 接口设计是指对接口的设计和实现。在RealTek RTS5411主控...

    战争迷雾(V1.15) Unity插件.rar

    最终的战争迷雾包使您能够迷惑您的 2D 或 3D 游戏,向玩家隐藏秘密元素。 FogOfWar 是高度模块化、可定制和快速发光的,可以满足任何需要在其周围笼罩上一层厚厚薄雾的 RTS、MOBA 或冒险游戏的需求。

    visual c++ vc 开发RTS即时战略游戏(源码).zip

    visual c++开发RTS即时战略游戏(源码).zip

    RTS Engine v1.4.7.zip

    《Unity3D RTS Engine v1.4.7...这个插件不仅可以作为快速开发的起点,也是深入理解RTS游戏设计原理的绝佳案例。无论你是希望独立制作一款RTS游戏,还是希望通过实践提高Unity3D技能,这个插件都是不容错过的宝贵资源。

    【Unity即时战略(RTS)游戏开发工具包】RTS Starter Kit 快速搭建RTS游戏

    文件名:RTS Starter Kit v1.6.6.unitypackage ...开发者可以根据自己的需求对工具包中的脚本和资源进行修改,以适应不同的游戏风格和玩法。 支持多种游戏模式,如单人战役、多人对战等。 ......

    【Unity即时战略(RTS)插件】RTS Battle Kit 提供多种功能模块,快速构建 RTS 游戏的核心机制

    单位控制:支持典型的RTS游戏中的单位选择和命令系统。玩家可以通过鼠标框选或点击选择单个单位或多个单位,并指挥它们移动、攻击或进行其他操作。 战斗系统:插件内置了攻击、防御和战斗逻辑。单位可以使用近战、...

    尝试使用 Unity 和纯 ECS 重新创建一个简单的RTS游戏_C#_代码_下载

    在本项目中,开发者尝试利用 Unity 引擎和其最新的数据驱动编程模型——实体组件系统(Entity Component System,简称 ECS)来构建一个实时战略(Real-Time Strategy,简称 RTS)游戏。ECS 是一种架构模式,它鼓励将...

    基于C++开发UE4魔兽RPG风格的RTS游戏模板源码.zip

    基于C++开发UE4魔兽RPG风格的RTS游戏模板源码.zip基于C++开发UE4魔兽RPG风格的RTS游戏模板源码.zip基于C++开发UE4魔兽RPG风格的RTS游戏模板源码.zip基于C++开发UE4魔兽RPG风格的RTS游戏模板源码.zip基于C++开发UE4...

    RTS5306读卡器图纸

    根据提供的文档信息,我们可以推断出这是一份关于RTS5306 USB 3.0读卡器的图纸文档。接下来将详细解读并总结出关键的技术知识点。 ### RTS5306 USB 3.0读卡器图纸知识点 #### 1. **RTS5306读卡器概述** - **型号*...

    RS232中RTS和CTS的作用

    对于那些需要深入了解这些概念的学生和工程师来说,了解RTS与CTS的工作原理及其在实际通信场景中的应用是非常有益的。 最后,尽管USB和其他新型接口标准在许多方面已经超越了RS232,但在一些特定的场景中,RS232...

    802.11协议中RTS-CTS技术细节介绍.docx

    无线驱动的RTS-CTS控制原理遵循一定的原则,如只对单播数据使用,不对聚合报文整体控制,而是针对每个子报文,以及根据第一个子报文的控制标记决定是否使用RTS-CTS。如果报文长度超过8K且不启用RTS-Threshold,则不...

    USB3.0 HUB RTS5411芯片参考电路,参考设计

    上述提供的内容中,包含了USB3.0 HUB RTS5411芯片参考电路设计的关键知识点,包括供电方式、电路保护机制、信号完整性和布局布线等,这些都对于确保USB3.0 HUB芯片可靠、稳定地工作至关重要。对于工程师来说,这些...

    Java 游戏 Java编写的自动化RTS塔防游戏 Mindustry

    Mindustry 是一款由 Java 编写的自动化塔防 RTS 游戏。该游戏提供了丰富的功能和策略性的玩法,让玩家能够体验到全新的游戏体验, 压缩包内同时也包括了服务端, 可以跨平台多人一起合作进行游戏,附上游戏运行方法; ...

    Unity允许单人多人超好玩的即时RTS游戏引擎源码UnityPackage包

    在RTS游戏中,关键元素包括单位生成、路径规划、资源管理、建筑系统和玩家交互等。源码中应包含了这些功能的实现。 1. **单位生成**:在RTS游戏中,玩家可以创建和控制多个单位。源码中可能包含了单位的创建、升级...

    超级好用的rts游戏开发包(支持unity5.x以上版本)

    可以用这个实现rts游戏,实现什么样的看你的水平了 注:自带游戏地图编辑器 使用文档参考demo

    RTS-社区-项目:让我们使用虚幻引擎4构建一个RTS游戏!

    但是,您可以贡献或传播有关是使用C ++在虚幻引擎中制作的新RTS游戏。 查看的新。 对于所有为此项目建模的人,请将带有名称和其他模型详细信息的模型添加到该文档。 要获得对文档的访问权限,请在虚幻引擎论坛上将...

    Defold游戏引擎 的 RTS示例项目_go语言_代码_下载

    文件名"warbattles-rts-master"暗示了这是一个关于战争策略的游戏项目,可能包含了战斗系统、资源管理系统、地图编辑器等多个模块。通过研究这个项目,开发者可以学习到如何在Defold中构建复杂的AI系统,实现单位的...

    RTS和CTS是什么意思

    RTS(Request to Send)和CTS(Clear to Send)是串行通信中用于实现硬件流控制的两个重要信号。在串行通信系统中,尤其...理解RTS和CTS的工作原理及其在实际通信系统中的应用,对于设计和维护可靠的通信系统至关重要。

    Unity-ECS-RTS:尝试使用Unity和纯ECS重新创建简单的RTS游戏

    这在处理大规模单位和复杂逻辑的RTS游戏中尤为重要,可以显著降低内存占用和提高帧率。 本教程系列将引导你逐步完成以下关键知识点: 1. **ECS基础**:首先,我们将学习ECS的基本概念,包括如何创建实体、添加组件...

Global site tag (gtag.js) - Google Analytics