我有一个粒子系统,为此我渲染(例如 1 个粒子效果(100 个带有纹理的四边形。如果我添加几个粒子效果,它会滞后,因为每个粒子都有自己的柔韧性(2f 矢量(、位置(3f vec(等......(矢量来自LwJGL(
因此,每个实例意味着 5 或 6 种数据类型。现在我的问题是:
有没有办法让它变得更好,这样不是每个实例都有 5 个新向量?(而且我知道,还有许多其他更好的方法来创建粒子系统,但我选择的这种方法很容易,我可以练习"性能提升"。
好的,所以,我将参考这段代码,你可能会从中得到启发。
我还假设您至少有 GL 3.3 配置文件。
从理论上讲,要进行优化,您应该在 GPU 上移动Map<ParticleTexture, List<Particle>> particles
(使用纹理图集(,并仅上传每帧不断变化的数据,例如camera
.但这并不容易一步到位,所以我建议你通过在 GPU 上一次移动一件事来逐步修改你当前的算法。
一些观察:
- 在
prepare()
和finishRendering()
中,启用第 i 个顶点 AttribArray 是 vao 的一部分,如果你绑定/解绑 vao,就足够了。 可以移除glEnableVertexAttribArray
和glDisableVertexAttribArray
- 使用制服缓冲区,不要单独拥有所有这些单一制服。
-
loader.updateVbo()
非常昂贵,但它每render
创建一个FloatBuffer
,并在复制数据之前清除缓冲区。您应该只分配一次float []
或FloatBuffer
,重用它并简单地调用glBufferSubData
,避免glBufferData