May 7

谈谈天气系统在游戏中的实现

游戏开发

今天来说说天气系统(或者说雨雪天气)的实现,这个问题最容易让人想到的就是使用粒子系统模拟,或者在眼前(2d空间内)渲染一些下落的粒子,在老的《天下贰》引擎中就使用的是后者,这样虽然效率高,但从视觉感受上说,很假很失真;如果使用粒子系统模拟,就需要解决效率问题和粒子与3d场景碰撞的问题,要不然就会产生在帐篷内头顶也有雨滴的现象。

先来说说效率问题,我前边的博客也有提到,影响d3d渲染效率的因素很多,其中之一就是DP的调用,而模拟雨雪天气一般都需要使用上万个的粒子,对于一般粒子系统的实现可能就是上万次的DP调用,这简直是效率杀手,解决这个问题有很多方案,一种是使用类似d3d9 sdk instance的那个例子,减少DP的调用,但这个例子的实现方法对硬件稍微有点需求,不太适合低档显卡;还有一种方法就是创建一个大的dynamic buffer,把所有粒子的顶点合并到这个大的buffer上,每个粒子2个三角形,6个顶点,在cpu算好所有粒子的世界坐标,然后调用一次DP完成全部绘制工作。方法2经过实际测试,效率还是不错的,而且对硬件几乎没有什么需求。

为了不产生屋檐下还有雨滴的假象,还有就是当雨滴掉落在地上的时候会溅起水花,我们需要解决粒子与3d场景的碰撞(交互)的问题,上面已经说了,可能会有上万个粒子,我们要对上万个粒子实时计算碰撞几乎是不可忍受的,为了解决这个问题,可以从如下几个方面去优化代码:

  • 多开一个线程异步计算粒子的碰撞,还没有计算出来的粒子不绘制,这在多核cpu上,性能提升明显;
  • 对于已经计算过的位置做cache,避免多次重复计算相同的位置,或者临近的位置;
  • 减少每秒需要的碰撞计算,尽量重用上一次的计算结果;
  • 仅在相机周围的有限范围内绘制粒子,《天下贰》实际测试,仅需要100米半径的方形内就可以模拟暴雨、暴雨的天气;
  • 充分优化碰撞算法的实现,这方面优化方案很多,基本就是空间管理,bsp,hull tree等。

经过《天下贰》实际测试,通过上面的方法优化可以获得相当不错的天气模拟效果,并且基本不损失游戏运行效率;

测试机器:8800GT 256M显存,2.2G 双核,2G内存。

to "谈谈天气系统在游戏中的实现"

  1. 黄和 Says:

    现在的天下贰的天气效果基本上没有试过,应为机子带不起来。AND我来这里的原因是“www.momoou.com”的返回地址是链接到的这里,我很好奇

  2. 北天空空 Says:

    看看

  3. effulgent Says:

    我有土办法毫无效率损耗的实现天气粒子碰撞

Leave a Reply