java - OpenGL使用错误?

标签 java opengl optimization lwjgl

我使用 LWJGL 用 Ja​​va 编写了一个小型粒子系统。
因此我使用 openGL。
现在我读到,改变纹理非常慢。所以我确保,我只更改用于一堆粒子的纹理,然后绘制所有这些粒子。
尽管只同时绘制了 60 个粒子,但我的 FPS 仍然从 8000 左右下降到 4000。
我知道问题出在渲染上,因为当我只更新粒子但不绘制它们时,FPS 不会下降。
如果有人能告诉我我的 OpenGL 代码出了什么问题,那就太好了。

这是管理粒子的粒子发射器:

public void render() {
//Initialize....
GL11.glMatrixMode(GL11.GL_MODELVIEW);
BloodParticle.PARTICLE_TEXTURE.bind();

for(Integer index : this.getBlockedParticles()){
    this.getParticles()[index].render();
}

GL11.glDisable(GL11.GL_TEXTURE_2D);
}

这是单个粒子的渲染方法:

public void render() {
if(!this.isAlive()){
    return;
}

// Store matrix
GL11.glPushMatrix();

// Set to particle's position and scale
GL11.glTranslatef(this.getPosition().getX(), this.getPosition().getY(), 0);
GL11.glScalef(3.5f, 3.5f, 1.0f);

// Set the current alpha.
GL11.glColor4f(1.0f, 1.0f, 1.0f, this.getAlphaFade());

//Draw the texture on a quad.
GL11.glBegin(GL11.GL_QUADS);
{
    GL11.glTexCoord2f(0, 0);
    GL11.glVertex2f(-PARTICLE_TEXTURE.getImageWidth()/2.0f,
            -PARTICLE_TEXTURE.getImageHeight()/2.0f);

    GL11.glTexCoord2f(0, 1);
    GL11.glVertex2f(-PARTICLE_TEXTURE.getImageWidth()/2.0f,
            PARTICLE_TEXTURE.getImageHeight()/2.0f);

    GL11.glTexCoord2f(1, 1);
    GL11.glVertex2f(PARTICLE_TEXTURE.getImageWidth()/2.0f,
            PARTICLE_TEXTURE.getImageHeight()/2.0f);

    GL11.glTexCoord2f(1, 0);
    GL11.glVertex2f(PARTICLE_TEXTURE.getImageWidth()/2.0f, 
            -PARTICLE_TEXTURE.getImageHeight()/2.0f);

}
GL11.glEnd();

//Get the matrix again.
GL11.glPopMatrix();
}

我知道 4000 FPS 已经足够了。但我只是担心 FPS 会下降一半,而且目前游戏中只有一个发射器。
我知道这对于 60 的固定 FPS 和超过 3 个发射器来说会成为一个问题。

最佳答案

状态更改与您的性能问题无关。

这有:

//Draw the texture on a quad.
GL11.glBegin(GL11.GL_QUADS);
{
    GL11.glTexCoord2f(0, 0);
    GL11.glVertex2f(-PARTICLE_TEXTURE.getImageWidth()/2.0f,
            -PARTICLE_TEXTURE.getImageHeight()/2.0f);

    GL11.glTexCoord2f(0, 1);
    GL11.glVertex2f(-PARTICLE_TEXTURE.getImageWidth()/2.0f,
            PARTICLE_TEXTURE.getImageHeight()/2.0f);

    GL11.glTexCoord2f(1, 1);
    GL11.glVertex2f(PARTICLE_TEXTURE.getImageWidth()/2.0f,
            PARTICLE_TEXTURE.getImageHeight()/2.0f);

    GL11.glTexCoord2f(1, 0);
    GL11.glVertex2f(PARTICLE_TEXTURE.getImageWidth()/2.0f, 
            -PARTICLE_TEXTURE.getImageHeight()/2.0f);

}
GL11.glEnd();

想一想:每个粒子都会引起 8 次 OpenGL 调用。对于数千个粒子来说,这是一个巨大的开销。更糟糕的是,您甚至没有将多个四边形批处理到单个 glBegin/*glEnd* block 中。

以下是提高性能的方法:不要使用 glBegin/glVertex/glEnd 又名立即模式

使用顶点数组!

关于java - OpenGL使用错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17146349/

相关文章:

python - Cython 的功率谱

java - 使用 DefaultHttpClient 发送整数值

java - JDBI 结果集映射器从查询结果集中创建对象列表?

c++ - 使用一个 glDrawArrays 命令绘制多个不同颜色的三角形

javascript - 需要优化if语句

c - 如何以更优化的方式提取位?

java - 如何在java中使用已弃用的导入?

java - Java逆向工程

java - 如何使用 LWJGL 将 BufferedImage 绘制到屏幕上?

opengl - 与片段着色器中的所有顶点不同,没有插值。为什么不?