灵活粒子系统 - 开始






4.83/5 (4投票s)
灵活粒子系统 - 开始
粒子系统太棒了!你不仅可以创造出令人惊叹的效果,还能优化代码,将越来越多的像素推送到屏幕上。本系列文章将介绍如何设计一个灵活的粒子系统,并应用一系列优化措施来提高其运行速度。灵活意味着它可以在实际应用中用于各种图形效果。
引言
一段时间以来,我一直在玩我自己的小粒子系统。之前的一篇文章展示了我用该系统制作的一些效果。从那时起,我没有再制作其他效果,但我花了很多时间进行优化和改进。
我想展示更多,或者说我将代码优化了100000%……但这没那么容易。:) 我认为分享我目前的经验还是很有价值的。
本文将介绍粒子系统的基础知识以及我的假设。
我们开始吧!
系列文章
全局视角
创建粒子系统需要什么
- 粒子数组 - 我们需要一个容器来存放粒子。粒子是动态的,所以我们也需要一种有效的方法来使粒子“生”或“死”。看起来即使是
std::vector
也不足以满足此目的。另一个问题是,一个粒子应该包含哪些数据?我们应该使用结构体数组(AoS)还是数组结构体(SoA)? - 生成器/发射器 - 它们创建(激活)粒子,设置它们的初始参数。
- 更新器 - 当粒子处于活动状态时,必须有一个系统来更新它并管理它的运动。
- 渲染器 - 最后,我们需要一种方法将所有数据推送到屏幕上并渲染整个系统。渲染粒子系统本身就是一个有趣的话题,因为有许多可能的解决方案和技术。
大概,这些就是良好开端所需的一切。
无状态与保持状态的粒子系统
在实现粒子系统时,重要的是要注意我们可以通过两种方式更新粒子
无状态方式
这意味着我们从初始值计算当前位置/数据/状态,而不存储此计算状态。看看这个用于简单粒子系统的简单运动方程
pos = pos_start + vel_start*time + 0.5*acc*time*time;
计算出的
pos
通常仅用于渲染。在下一帧中,time
会改变,因此我们将得到一个不同的pos
值。许多图形教程都有这样的粒子系统。这在顶点着色器示例中尤为明显。您可以将粒子的起始数据传递给顶点着色器,然后只更新时间值。看起来不错,但使用这种技术很难创建高级效果。
优点
- 易于使用,无需额外数据,只需初始值
- 非常快:只需创建初始数据,仅在粒子被销毁或创建时才需要更新粒子缓冲区
缺点
- 仅适用于简单的运动方程
保持状态
顾名思义,我们将存储粒子的当前状态。我们将使用之前的状态来计算当前状态。其中一种最流行的方法称为欧拉方法
vel = vel + delta_time * acc;
pos = pos + delta_time * vel;
优点
- 可用于创建高级效果
缺点
- 需要存储内部/当前状态
- 比无状态系统需要更多的计算和更新
我将暂时搁置这个话题,但当我展示该系统的实际实现时,它还会再出现。
假设/要求
我希望通过该系统实现的目标
- 可用性 - 整个系统不仅仅是一个带有简单更新循环的小实验,它可以用于创建几种不同的效果。
- 易于扩展 - 不同的模块或创建自定义部分的选项。
- 性能 - 应该足够快。这是一个相当模糊的规格,但整个优化部分将是测试新想法的绝佳游乐场。
- 我的目标是在我的系统上至少流畅地运行10万个粒子(60fps)。如果能达到100万个就更好了,但这在CPU版本上并不容易。
- 仅限CPU - 我知道目前GPU实现更好,但为了实验,我选择了仅CPU。也许在第二版中,我会将其重写为OpenCL或OpenGL计算着色器。
- CPU版本也为实验CPU到GPU的缓冲区传输提供了机会。
- 目前是一个简单的OpenGL 3.3+渲染器
下一步
在下一篇文章中,我将介绍粒子数据及其在系统中使用的容器。
笔记和链接
这是一系列对我实现有所帮助(或将会有帮助)的链接和资源
- The Software Optimization Cookbook: High Performance Recipes for IA-32 Platforms, 2nd Edition, Intel Press; 2nd edition (2005年12月) - 很难找到的书,但我曾在2011年GDC Europe上赢得过!:)
- Video Game Optimization by Eric Preisz and Ben Garney
- Intel Creating a Particle System with Streaming SIMD Extensions - 相当老,但非常容易理解的教程。
- Building a Million-Particle System - for
- Particle Systems From the Ground Up by Matt Greer - 关于JavaScript和WebGL粒子非常棒的文章。
- Gamasutra Building an Advanced Particle System