gdc16的文章,是一个多个文章的合集,包括了rainbow6 siege的标志性技术:大规模破坏,以及相关的渲染技术。
整个游戏拥有前所未有的破坏的效果,也是游戏的核心,非常的畅快和酷炫,可以看下这个宣传视频:
http://www.bilibili.com/video/av9382404/?from=search&seid=5837922225268221158
本文主要聊这么几个话题:
- Tom clancy rainbow 6 介绍
- 破坏技术
- 渲染技术
=======Tom Clancy’s Rainbow 6 : Siege=======
Tom Clancy :是一个军事小说家的名字,后来他变成一个“品牌”,很多军事小说已经是由写手来写了,据说其中一个人已经写得比tom clancy还tom clancy,让老爷子“压力很大”。。。
Tom Clancy’s 游戏系列: Rainbow 6, Division, Splinter Cell, Ghost Recon, End War。。。虽然没有COD那么的大名鼎鼎,但是在玩家心目中也是占有了一席之地。
Tom Clancy’s Rainbow 6 : 是一个策略型(军事)射击游戏,相对于传统的飚枪法的游戏,注重策略型设计,侧重策略,潜入和团队。
Tom Clancy’s Rainbow 6 | Siege : 是Rainbow 6 的第19部作品,2015发售,游戏以前所未有的出色的破坏为技术亮点,品质也相当不错,卖了535万拷贝销量, 商业上很不错的表现
现在steam上热度也是不错。
=======破坏技术=======
常规破坏技术:pre fragment
这里多个phyx中间件都给出了解决方案,比如:
- Phyx apex destruction
- Havok destruction
运用的过程是:工具中预制破坏信息和模型(工具可以加速),游戏中触发,物理模拟,主打视觉
其中有各种特效飞溅的效果,需要中间件或者引擎的良好支持,比如这时候havok fx又出来大显身手,把大量飞溅的木屑很高效很高质量的表现出来。
ubi的独门绝技:real blast
它和常规的破坏不同的就是:
- 它可以把墙任意打破,比如:打个洞,形成射击视野,挖个洞,自己爬过去。。。
- 和游戏性结合:这里不是一个看看就好的效果,可以形成很多战术特点的
- 而且这个是一个深度的和游戏系统结合的模块,深入到了几乎所有的模块,包括服务器
(可以看出,realblast是深入的嵌入到各个模块之中,影响着整个游戏,所以这个也很难中间件化,实在是太紧耦合了)
=======Procedural destructio算法=======
模型破坏
这里首先是一些逻辑结构,把典型的物件以这样的逻辑结构来进行拆解:
把一个复杂的模型简化成一个leaf graph(概念上很像骨骼)
然后在受到撞击的时候,就以简单的结构来处理破坏信息,然后应用到整体的模型上去:
surface破坏
就是一面墙这种会破坏的方式:
这里把墙这种最典型的模型拿出来作为一个专项来处理,由于是这种扁平状的东西,所以就简化为surface来进行simulation。
然后基本的算法过程是:对于打击点,产生一些固定的pattern,比如这就是一种
其实这个模式还有很多种可以选择,比如:
然后和原有模型进行相交,扣掉其中打掉的部分,然后在崩出来pattern部分
然后把剩余的部分,进行三角化,产生新的mesh
然后三角形变成立体的mesh
切面加上一些点缀
美好的破坏就完成勒:
=======性能优化=======
这个过程计算量是不小的,优化技术但是我们都比较熟悉:
- 可以预测的情况下提前开始计算
- 把大型任务分成多个子任务,然后进行分帧+多线程计算
- 数据控制非常重要,连终极优化大法都用上了:程序员自己上,和美术猛撸地图
- runtime各种内存限制,pool等内存常用优化
恩,虽然套路上看起来都比较熟悉,但是在超大复杂系统里做出来是完全另外一码事情,非常让人敬佩。
=======服务器同步=======
在服务器上跑破坏的模拟,这套破坏代码很复杂,也让服务器程序员吃了不少苦头,这里需要考虑代码不能依赖帧数等等
同步的内容:
- 同步破坏的事件而不是破坏计算的内容
- 破坏有随机性,随机种子同步
及时反馈所常用的是:预演和同步的策略也是用的,产生破坏的时候,本地离开开始模拟,然后背后和服务器开始同步。
=======破坏的小结=======
- 技术角度看, 把游戏中的”破坏”,推进了一些
- 独特技术形成游戏核心, 不小的技术门槛
- 技术门槛就是讲了都没法抄 vs 没有技术门槛看一眼就能复制
- “高大上”的技术,背后是
- 多种技术的融合(渲染,havok fx), 影响和交互几乎整个游戏,我们常规的看法,技术像积木一样搭来搭去,很多时候是我们希望的“那种简单”,实际情况,遇到这种杀手级的特性,渗入到游戏的方方面面,其实是合理正规的技术选择。
- 产品化的重要性
- 实际落地, 见玩家,其实早期他们技术也做的挺多,但是在产品化的过程中,面对各种复杂的情况,才真正让技术成熟起来
- 接受更严格的考验,让技术更完善
优化
- ”异步&多线程&分帧”
- 美术撕逼—一件好事,其实我们在做天刀的时候就是,当程序和美术友好的争执的时候,才是最好的时候。
=======渲染模块=======
这里相对来说,渲染模块不是siege的长项,原创的比较好的东西比较少,但是毕竟在ubi montreal,所以很多其他项目中的(比如刺客信条,farcry)系列中的技术都可以应用过来,比如:
- Clustered rendering
- Shadow:有shadow cache,有hi-z帮助culling
- 有刺客信条的GI的做法
这里两个技术比较重要和由特点:
—-draw call batch—-
由于这是一个大规模破坏的游戏,所以会产生出大量的飞屑,这个对于渲染效率是一个大的挑战,所以ubi把大量的相同材质的物件做一个batch,通过dynamic buffer合成一个drawcall,这个非常的有效,可以看下数据:
—-Checker board rendering—-
这个是一个使用低分辨率,然后插值出高分辨率的渲染方式,之前虽然也有尝试,但是不成熟,现在rainbow 6
siege中看来使用的比较好:
- ¼ 分辨率(1/2 长, 1/2宽) , Msaa 2x, 全sample
- 通过周围像素,前一帧像素信息重组
- Teeth filter
使用了这些策略来达到的比较好的效果,同时着色计算的像素数量少多了。
ref:
- Jalal Eddine El Mansouri:”Rendering ‘Rainbow Six | Siege’”
- Julien L’Heureux: The Art of Destruction in ‘Rainbow Six: Siege’
- 喝十八:https://www.zhihu.com/question/49317501