2012-05-09 9 views
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; 
} 

私はコード2CODE1よりも遅くされるべきだと思う理由、それはネイティブ8の近くに何百万を持っているということですしかし、コード1にはほんのわずかしかありません。彼は結果で同じことをする。

なぜ、どのようにコードのパフォーマンスを改善できますか?

+0

これらのメソッドをどのように正確に呼び出すことができますか?タイトなループ、タイマーなどありますか? – NPE

+0

asyncExecのRunnableで表示されます。 1つのコールが終了すると、もう一度コールします。 –

答えて

1

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

+0

ありがとう!パフォーマンスはほぼ倍増しました。 –

0

glVertexPointerglDrawElementsのコード2のメソッドが指定された配列を反復処理すると、コード1の場合と同じくらい多くの反復とメソッドが処理されるため、OpenGLメソッドの処理は重要です。あなた自身の反復。私はOpenGLに慣れていませんが、glVertexPointerglDrawElementsは、各要素にglVertex3fを呼び出すのと同等のものを作成するために、提供された配列を反復処理する必要があります。

要するに、Javaコードでも、ロードされたライブラリ自体でも、イテレーションとネイティブメソッド呼び出しの量はほぼ同等です。

コードを改善するために、私はOpenGLを使ったことがないので、何も言いません。

+1

この表現は本当ですか? (ネイティブメソッドが読み込まれると、非ネイティブメソッドを呼び出すのとほぼ同じ時間がかかります) 参考にしてもらえますか? –

+0

私は実際にその声明に間違っていたと思います。 http://www.javamex.com/tutorials/jni/overhead.shtml – Vulcan

関連する問題