粒子系统在上一篇博客中简单介绍了一下:DirectX中的粒子系统
现在我们知道,粒子系统是动态的,我们必须每一帧都去更新这个粒子系统,有一种直观但是效率不高的方法如下:
1、更新所有粒子的状态
2、创建一个足够容纳粒子系统中最大粒子数目的顶点缓存
3、将所有处于活动状态的粒子赋值到这个巨大的顶点缓存中去
4、将顶点缓存中的粒子全部绘制出来
该方法的效率不高的原因,其一是因为我们必须创建一个足够大的顶点缓存,里面需要存放粒子系统中最大的粒子数目;其二是因为我们在创建顶点缓存之后,需要将所有的顶点都复制到顶点缓存里面,数目非常的大,此时GPU的没有任何的事情在做的,相当于空闲状态,此时因为CPU和GPU没有协同工作,所以效率是不高的。
一种更好的方法就是我们现在创建一个合理大小的顶点缓存,然后我们将这个顶点缓存划分为几个片段,比如,我们创建一个可以容纳2000粒子的顶点缓存,然后我们把它分为4个片段,每一个片段可以容纳500个粒子,然后创建一个全局变量i来跟踪这个片段。
上面这个是一种理想化的情况,事实上我们总是在不断的创建和销毁粒子,所以粒子的数目很有可能不足500,填不满一个片段,比如现在我需要绘制200个粒子,我们可以将这种情况作为一个特殊的情况来处理,这种情况只会在当前帧时填充最后一个片段时发生,也就是我们将不够一个片段的粒子放在最后一个片段去填充。
该方案的优点在于,大大减少了顶点缓存的大小,而且使得CPU和GPU可以协同工作,因为我们先去赋值一部分的顶点在顶点缓存