2013-06-17 2 views
0

Я написал небольшую систему частиц в Java с LWJGL.
Итак, я использую openGL.
Теперь я читаю, что изменение текстуры происходит очень медленно. Поэтому я уверен, что я только изменяю текстуру, которая используется для кучи частиц, а затем рисует все эти частицы.
По-прежнему мой FPS падает примерно с 8000 до 4000, хотя в то же время нарисовано только 60 частиц.
Я знаю, что проблема заключается в рендеринге, потому что, когда я просто обновляю частицы, но не рисую их, то у меня нет падения в FPS.
Было бы здорово, если бы кто-нибудь мог сказать мне, что не так с моим кодом OpenGL.Неправильное использование 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 и только с одним эмитентом в игре.
Я знаю, что это станет проблемой при фиксированном FPS 60 и более 3 эмиттеров.

+0

«* Но я просто напугался этой капли на половину FPS и только с одним эмитентом в игре. *« Капля с 8000 FPS до 4000 представляет собой 0.125 *** милли * секунд разницы во времени , Это не проблема. Измерение по частоте кадров не помогает; всегда измерять * время *. –

ответ

4

Изменения состояния не имеют ничего общего с вашей проблемой производительности.

Это:

//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 *.

Вот как улучшить производительность: Не используйте glBegin/glVertex/glEnd аки немедленного режима

использование вершинных массивов!

Смежные вопросы