1

私はしばらくの間OpenGLをプログラミングしてきましたが、OpenGLESはまったく初めてです。私が抱えている問題の1つは、効率的な方法で画面にプリミティブを描画することです。

画面上に(異なる変換で)多数の等しいラインループを描画する必要があり、このコードでパフォーマンスが大幅に低下することに気づきました。

gl.glColor4f(0.5f, 0.5f, 0.5f, 1.0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, this.vertices);

for (int j = 0; j < height; j++)
{
    for (int i = 0; i < width; i++)
    {
        gl.glPushMatrix();

        gl.glTranslatef(i, j, 0);
        gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4);

        gl.glPopMatrix();
    }
}

ここでは、 glDrawArraysが悪者だと思います。

だから問題は、どうすればたくさんのラインループを効率的に描くことができるかということです。GL_LINE_LOOPを使用する場合は、プリミティブごとにglDrawArraysを呼び出す必要があるため、タイプをGL_LINESに変更する必要がありますか?頂点配列(上記のコードでは、4つの頂点を保持)は幅*高さ* 8の頂点を保持するため、これは膨大なメモリの浪費を課します。

私はAndroidOpenGLES1.1用にプログラミングしています。

4

2 に答える 2

1

ここでは、glDrawArraysが悪者だと思います。

はいといいえ。DrawArraysは高速な呼び出しではないと言っているのは正しいですが、頻繁に呼び出さない場合は、何かをレンダリングするための最速の方法です。

タイプをGL_LINESに変更する必要がありますか?

はい、1回の描画呼び出しですべてを描画できるようにします

頂点配列(上記のコードでは、4つの頂点を保持)は幅*高さ* 8の頂点を保持するため、これは膨大なメモリの浪費を課します。

たった4つの頂点と比較すると、それはメモの無駄として見ることができると思います。しかし、GPUは一度に大きなバッチをレンダリングするように構築されているため、小さなバッチを大量に描画することは嫌になります。

また、頂点を保持するのに十分なメモリが必要ですが、これは問題にはなりません。

于 2012-06-17T12:26:13.370 に答える
1

ここでは、glDrawArrays が悪者だと思います。

悪者はあなたであり、関数呼び出し/コンテキスト切り替えの予算を非効率的に使用しています。すべての行を 1 つの配列 (GL_LINES として) にパックし、1 回の呼び出しで GPU に送信します。いいえ、1 ページ (通常は 4kiB) 未満を割り当てることはできないため、メモリを無駄にしているわけではありません。

于 2012-06-17T12:23:51.417 に答える