個人用の小さな 2D グラフィックス/ゲーム ライブラリに取り組んでおり、現在、タイル マップを描画する際のパフォーマンスを向上させる方法を考えています。現在、マップ内の各タイルに対して静的な GL_QUADS VBO を作成し、それを画面に描画しています。各 VBO は、サブイメージ化されて VBO にマップされるメモリにロードされたテクスチャを参照しています。
現在、テスト中の 20 x 20 のタイル マップがあります。私の現在の実装では、個々のタイルを描画する必要があるため、フレームごとに 400 回の glDraw* 呼び出しが行われます。
たとえば、タイル マップの各行を 1 つの VBO にする方法はありますか? これにより、この例では、glDraw* 呼び出しが 20 に減少します。サブイメージをどのようにマッピングしますか? 個々のタイルを回転できます。
Texture Atlas の使用についての言及を見たことがあります。それは良い代替案でしょうか?これをopenglで実装する方法に関する便利なリンクはありますか?
コード:
現在のレンダリング方法:
public void render() {
texture.bind();
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
for (SpriteSheet spriteSheet : spriteSheets) {
VBO vbo = spriteSheet.getVBO();
float angle = spriteSheet.getAngle();
vbo.bind();
if (angle != 0) {
glPushMatrix();
Vector2f position = spriteSheet.getPosition();
glTranslatef(position.x, position.y, 0);
glRotatef(angle, 0.0f, 0.0f, 1);
glTranslatef(-position.x, -position.y, 0);
glVertexPointer(Vertex.positionElementCount, GL_FLOAT, Vertex.stride, Vertex.positionByteOffset);
glColorPointer(Vertex.colorElementCount, GL_FLOAT, Vertex.stride, Vertex.colorByteOffset);
glTexCoordPointer(Vertex.textureElementCount, GL_FLOAT, Vertex.stride, Vertex.textureByteOffset);
glDrawArrays(vbo.getMode(), 0, Vertex.elementCount);
glPopMatrix();
}
else {
glVertexPointer(Vertex.positionElementCount, GL_FLOAT, Vertex.stride, Vertex.positionByteOffset);
glColorPointer(Vertex.colorElementCount, GL_FLOAT, Vertex.stride, Vertex.colorByteOffset);
glTexCoordPointer(Vertex.textureElementCount, GL_FLOAT, Vertex.stride, Vertex.textureByteOffset);
glDrawArrays(vbo.getMode(), 0, Vertex.elementCount);
}
vbo.unbind();
}
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
texture.unbind();
}