0

これら 2 つのコードが同じ条件で実行されているのに、実行時間に差がないのはなぜですか?

コード 1

static long time = 0;

static int n = 200;

static float[] vq = new float[200 * 200 * 200 * 3];
static int[] iq = new int[200 * 200 * 200];

static FloatBuffer verts = BufferUtils.createFloatBuffer(vq.length);
static IntBuffer ind = BufferUtils.createIntBuffer(iq.length);

static void draw() {

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                int index = (i * n * n) + (j * n) + k;
                vq[3 * index + 0] = i;
                vq[3 * index + 1] = j;
                vq[3 * index + 2] = k;

                iq[index] = index;
            }
        }
    }

    verts.put(vq);
    ind.put(iq);

    verts.flip();
    ind.flip();

    GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);

    GL11.glVertexPointer(3, 0, verts);

    GL11.glDrawElements(GL11.GL_QUADS, ind);

    GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);

    long newTime = System.currentTimeMillis();
    System.out.println(newTime - time);
    time = newTime;
}

コード 2

static int n = 200;

static long time = 0;

static void draw() {

    GL11.glBegin(GL11.GL_QUADS);

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                GL11.glVertex3f(i, j, k);
            }
        }
    }

    GL11.glEnd();

    long newTime = System.currentTimeMillis();
    System.out.println(newTime - time);
    time = newTime;
}

Code 2はCode1よりも遅いはずだと思う理由は、800 万近くのネイティブ呼び出しがあるためですが、Code 1にはほんの少ししかなく、結果として同じことを行います。

その理由と、コードのパフォーマンスを改善するにはどうすればよいですか?

4

2 に答える 2

1

コード 1 には、値を配列にコピーしてから、配列をネイティブ メモリにコピーすることが含まれます。n が同じままである場合は、一度だけ実行することでこのオーバーヘッドを回避できます。

于 2012-05-09T07:37:57.933 に答える
0

ここで重要なのは、OpenGL メソッドが何をするかです。なぜなら、コード 2 のglVertexPointerおよびglDrawElementsメソッドが提供された配列を反復処理する場合、反復を独自に処理するコード 1 とほぼ同じ回数の反復とメソッドになるからです。私は OpenGL に精通していませんが、提供された配列を反復処理して、各要素で glVertex3f を呼び出すのと同等のものを作成する必要があると想定glVertexPointerしています。glDrawElements

要するに、反復とネイティブ メソッド呼び出しの量は、Java コードであろうと、ロードされたライブラリ自体であろうと、ほぼ同じです。

コードの改善に関しては、OpenGL を使用したことがないため、何も言うことはありません。

于 2012-05-09T07:19:21.593 に答える