4

まず、私のコードは決して最適化されていません。新しい方法がわからないので、古いglTranslatf()なども使用しています。これが私のコードです:

public class GenChunk {

Chunk c;
VBO vbo = new VBO();

int worldSize = 16;
int var4 = 16; // x
int var5 = 16; // z
int var6 = 16; // y

int xOffSet = 0;
int zOffSet = 0;

public GenChunk() {
    gen();
}

public void gen() {
    for (int x = xOffSet; x < worldSize; x++) {
        for (int z = zOffSet; z < worldSize; z++) {
            for (int y = 0; y < worldSize; y++) {
                glPushMatrix();
                glTranslatef(x, z, y);
                newChunk();
                glPopMatrix();
                xOffSet += 16;
                zOffSet += 16;
            }
        }
    }
}

private void newChunk() {

    vbo = new VBO();

    glBindBuffer(GL_ARRAY_BUFFER, vbo.vboVHandle);
    glVertexPointer(3, GL_FLOAT, 0, 0L);

    glBindBuffer(GL_ARRAY_BUFFER, vbo.vboCHandle);
    glColorPointer(3, GL_FLOAT, 0, 0);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    for (int y = 0; y < var6; y++) {
        for (int x = 0; x < var5; x++) {
            for (int z = 0; z < var6; z++) {
                glPushMatrix();
                glTranslatef(x, z, y);
                glDrawArrays(GL_QUADS, 0, 24);
                glPopMatrix();
            }
        }

    }
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
}

}

そしてVBOクラス:

public class VBO {

public int vboVHandle;

public int vboCHandle;

public float size = 0.5f;
public float color = 0.5f;

public FloatBuffer vertices;
public FloatBuffer colorData;

public VBO(){

colorData = BufferUtils.createFloatBuffer(3 * 4 * 6);
colorData.put(new float[]{
        -color, color, color,
        color, color, color,
        -color, color, color,
        color, color, color,

        -color, color, color,
        color, color, color,
        -color, color, color,
        color, color, color,

        -color, color, color,
        color, color, color,
        -color, color, color,
        color, color, color,

        -color, color, color,
        color, color, color,
        -color, color, color,
        color, color, color,

        -color, color, color,
        color, color, color,
        -color, color, color,
        color, color, color,

        -color, color, color,
        color, color, color,
        -color, color, color,
        -color, color, color
});
colorData.flip();

vertices = BufferUtils.createFloatBuffer(3 * 4 * 6);
vertices.put(new float[] {
        -size, -size, size,
        size, -size, size,
        size, size, size,
        -size, size, size,

        -size, -size, -size,
        -size, size, -size,
        size, size, -size,
        size, -size, -size,

        -size, size, -size,
        -size, size, size,
        size, size, size,
        size, size, -size,

        -size, -size, -size,
        size, -size, -size,
        size, -size, size,
        -size, -size, size,

        size, -size, -size,
        size, size, -size,
        size, size, size,
        size, -size, size,

        -size, -size, -size,
        -size, -size, size,
        -size, size, size,
        -size, size, -size});
vertices.flip();

vboVHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboVHandle);
glBufferData(GL_ARRAY_BUFFER, vertices, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);


vboCHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboCHandle);
glBufferData(GL_ARRAY_BUFFER, colorData, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

}

} 2つのチャンクをレンダリングするので、約8000個の立方体になります。10,000個のキューブをレンダリングし、60 FPSを維持している人の話を聞いたことがありますが、2つのチャンクをレンダリングすると、1FPSになります。私のハードウェアは問題ではなく、まともです。コードを狂ったように最適化する必要があることはわかっていますが、最適化しても、それでも遅くなるのではないかと心配しています。誰かが私がここで間違っていることを教えてもらえますか?

4

1 に答える 1

8

単一のキューブを含むVBOを使用してそれを操作しglTranslate()ても、パフォーマンスはまったく向上しません。

特定のチャンクのVBOには、複数のキューブが含まれている必要があります(16 3で、最悪の場合のチェッカーボードボリュームの場合は最大2048)。glTranslate()は、キューブごとではなく、チャンクレベルでのみ発行する必要があります。

編集:

ボリュームデータベースがあり、通常はある種の3D配列に格納されています。配列の各要素は、ブロックタイプ情報(草、土、岩など)およびその他の状態を保持するクラス/構造体(または単にintまたは!)です。また、特定のブロックがグラフィカルに不透明であるかどうかを通知できるcharような関数も必要です。bool IsOpaque( const BlockType& block)

指定されたチャンク内のすべてのブロックを反復処理します。ブロックIsOpaque()がその6つの隣接ブロック(±X、±Y、±Z)をチェックする場合。ネイバー!IsOpaque()が立方体のその側の2つの三角形(または1つのクワッド)の頂点を生成し(チャンク内の位置に応じて適切に(!経由ではなく)変換される)、それらをバッファーに追加する場合。glTranslatef()

チャンクの反復が完了したら、頂点のバッファーをVBOにアップロードします。

またはあなたはより空想を得ることができます。

于 2013-02-09T05:05:14.667 に答える