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