[译]01.打造灵活高效的粒子系统——前言

01_1

粒子系统很强大!不仅可以用它创建漂亮的特效,还可以通过优化它以便在屏幕上显示更多的像素。本系列的文章将讲述如何设计一套灵活的粒子系统,同时讲述一些优化的方法让它运行的更快。“灵活”是指该系统可以在真实的应用中和各种图形效果中使用。

转载请注明[本文连接][原文链接],谢谢!

  • 引言

前阵子我写了个小型的粒子系统。这篇帖子有截图展示了我用它做的一些特效。但从那以后我就没再做特效了,而是花时间在如何优化和提高这个系统。

我想给大家展示更多的内容,或者说我想1000倍的优化代码,但是这并不容易。尽管如此我还是觉得和大家分享我现在的经验是有价值的。

本文将讲解粒子系统的基础内容和我的一些假设。

开始吧!

  • 大框架

粒子系统必备的模块:

01_2

  • array of particles粒子数组,我们需要一个保存粒子的容器。粒子是经常变化的,所以需要一种高效的方式创建或删除它们。然后似乎连std::vector也不足以满足需求。另一件需要注意的事情是一个粒子需要包含哪些数据?这些数据是按AoS(Array of Struct)还是按Soa(Struct of Arrays)的方式保存?[译者注1]
  • generators/emitters产生器和发射器,用来创建粒子并设置初始值。
  • updaters更新器,当粒子存在的时候要有一种方式来更新它们,比如管理它们移动等等。
  • a renderer渲染器,这个子系统能把所有的粒子根据其属性(大小,颜色,位置等)渲染到屏幕上。渲染系统本身是个有趣的课题,因为有很多解决方案和技术可以讨论。

大概这些就是开始前需要了解的东西。

  • 状态和非状态粒子系统

实现粒子系统时,有两种更新粒子的方式:

无状态方式

无状态是指通过初始值计算出当前位置、颜色等数据,并且不保存该计算后的状态。比如下面这个简单的运动方程:

pos = pos_start + vel_start*time + 0.5*acc*time*time;

位置=初始位置+初始速度*时间+0.5*加速度*时间*时间

计算出来的位置仅用于显示,到下一帧时,因为时间变了,所以算出来的位置也就变了。

01_3

很多图形学的教程介绍这种粒子系统。尤其是作为vertex shader的例子。将粒子的初始值传给vertex shader,每次初始值都不用改,只需更新时间即可。这种方式看起来很方便,但是无法创建复杂的效果。

优点:

  • 很简单,只需初始值即可,不需要附加数据。
  • 速度快,只有在生成新粒子或者删除老粒子的时候才需要更新缓存。

缺点:

  • 只能用于简单的运动方程

 

有状态方式

“状态保存方式”顾名思义就是要保存当前状态。利用前一次的结果计算当前值。用这个方式最著名的例子就是欧拉法。

vel = vel + delta_time * acc;

pos = pos + delta_time * vel;

速度=速度+间隔时间*加速度

位置=位置+间隔时间*速度

01_4

优点:

  • 可以创建复杂的效果。

缺点:

  • 需要保存当前状态供后续使用。
  • 更新时比无状态多很多计算量。

现在先不展开讨论,等我们实现这套系统时再详解。

  • 假设/需求

这个粒子系统需要做到什么程度:

  • 目前只是简单的使用3+来渲染。
  • 只用CPU,我知道GPU版本效率会更高,但是对于该次实验我只是用CPU。也许下个版本我会把它写成用shader计算的。
    • CPU版本同时也可以测试CPU到GPU的缓冲传输。
    • 我常看的一本书《Video Game Optimization》,这本书里说了很多关于CPU、GPU和缓存的很有应用价值的内容。。
  • 高效-必须要足够快。这个是很模糊的要求,但是运行的很快可以方便的测试新想法。
    • 我的目标是至少10万粒子能跑到60帧流畅运行。最好能到100万个粒子,不过从CPU角度来说很难。
  • 易扩展-能使用不同的模型或方式去扩展
  • 可用的-整个系统不只是实验用的,可以用来创建很多不同的特效。
  • 下一步

下一篇文章,我准备写保存粒子数据的容器。

  • 链接

以下是一些帮组我实现这套系统的连接和资源:

SoA(Struct of Arrays)和AoS(Array of Struct)的区别,SoA是指你定义一个结构,然后使用这结构组成的数组,AoS是指各个属性先组成数组,然后使用这些数组组成的结构,这里有详细的解释1234

原文地址:http://www.bfilipek.com/2014/04/flexible-particle-system-start.html

No Responses

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

You must enable javascript to see captcha here!