保存许多实例数据的最佳方法



我有一个粒子系统,为此我渲染(例如 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,就足够了。 可以移除glEnableVertexAttribArrayglDisableVertexAttribArray
  • 使用制服缓冲区,不要单独拥有所有这些单一制服。
  • loader.updateVbo()非常昂贵,但它每render创建一个FloatBuffer,并在复制数据之前清除缓冲区。您应该只分配一次float []FloatBuffer,重用它并简单地调用glBufferSubData,避免glBufferData

相关内容

最新更新