2

openGL を使用する更新ウィンドウに glTexSubImage2D を使用しています。

この関数が戻るのに時間がかかり、CPU の 4% も消費していることがわかります。

私が使用するコードは次のとおりです。

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, (*i)->getTextureID());
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, (*i)->getWidth(), (*i)->getHeightView(),
    GL_BGRA, GL_UNSIGNED_BYTE,(*i)->getBuffer());

より良い実装を知っている人はいますか? より少ない CPU を使用する、より優れたパフォーマンスを備えたものはありますか?

現在、これは私のプログラムを遅くしています。

4

4 に答える 4

6

あなたができることはいくつかありますが、それらからどれだけの利益を得ることができるかは状況によって異なります。

まず、ピクセルのアップロード形式がドライバーのニーズに合っていることを確認します。あなたはそれをで処理しているようです。これはおそらく画像フォーマットGL_BGRA, GL_UNSIGNED_BYTEに対してドライバーが好むフォーマットです。GL_RGBA8

ただし、OpenGL 4.3またはARB_internalformat_query2を実装するドライバにアクセスできる場合は、実行時に優先アップロード形式を実際に検出できます。このように

GLint pixelFormat, pixelType;
glGetInternalFormativ(GL_TEXTURE_2D, GL_RGBA8, GL_TEXTURE_IMAGE_FORMAT, 1, &pixelFormat);
glGetInternalFormativ(GL_TEXTURE_2D, GL_RGBA8, GL_TEXTURE_IMAGE_TYPE, 1, &pixelType);

もちろん、これは、上記のフォーマット/タイプのペアでデータを生成するために、データ生成方法を変更できる必要があることを意味します。

ドライバーをなだめるための手順を実行したら、次の可能性は、バッファーオブジェクトを使用してピクセル転送データを保存することです。これはおそらく全体的なパフォーマンスには役立ちませんが、CPUの負担を減らすことができます。

ただし、これを最大限に活用するには、ピクセルデータをマッピングしてバッファオブジェクトのメモリに「直接」生成できる必要があります。これを行うことができれば、おそらくアップロードのCPUコストの一部を取り戻すことができます。そうでなければ、それは価値がないかもしれません。

これを行う場合は、適切なバッファオブジェクトストリーミング手法を使用する必要があります。

テクスチャをダブルバッファリングすることも役立つ場合があります。つまり、あるテクスチャオブジェクトからレンダリングしているときに、別のテクスチャオブジェクトにアップロードしているということです。これにより、前のレンダリングが完了するのを待つGPUストールが防止されます。これがどれだけ役立つかは、レンダリング方法によって異なります。

アプリケーションの特定の状況について詳しく知らなければ、言えることはあまりありません。

于 2012-10-28T20:04:22.970 に答える
3

テクスチャがフレームごとに実際に変化する場合は、ダブル バッファを使用してデータを GPU に転送する必要があります。(すべてのフレームを変更しない場合、明らかな最適化は 1 回だけアップロードすることです!)

各フレームで、データを 1 つのバッファーにアップロードし、別のバッファーからデータを取得し、フレームごとに使用するバッファーを切り替えます。これにより、GPU がメモリ転送の完了を待つ必要がないため、すべてが高速化されます。

PBO に関するチュートリアルは、私の能力を超えて答えを要約することはできませんが、「OpenGL Pixel Buffer Objects」は適切なリファレンスであり、「OGL Samples」リポジトリを見て、PBO がどのように機能するかを確認します。

ただし、事前にテクスチャ フレームを計算できない場合は、PBO を使用する利点はありません。を使用するだけglTexSubImage2Dです。

そうは言っても、 CPU の 4% は問題にならないかもしれません

于 2012-10-28T19:58:20.867 に答える
1

画面を更新するために、フレームごとにテクスチャのデータを変更するべきではありません。テクスチャは 1 回読み込まれ、変更されることはほとんどありません。画面上の個々のピクセルに書き込もうとしている場合は、OpenGL を使用せず、SDL などのタスクにより適したものを使用することをお勧めします。

編集:わかりました、これは必ずしも真実ではありません. 以下の説明を参照してください。

于 2012-10-28T19:43:54.437 に答える