gpt4 book ai didi

java - OpenGL使用错误?

转载 作者:行者123 更新时间:2023-12-01 18:47:31 24 4
gpt4 key购买 nike

我使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com