2011-09-07 10 views
5

私は、私のアプリケーションでInstrumentsからOpenGL ES解析ツールを実行しました。シェーダをコンパイルした後、preDarmingパスでglDrawArraysを呼び出す必要があると述べました。そこで、私が書いたシェイダーの時間を確認しましたが、プログラムを初めて実行するときはずっと遅いです。シェーダの最初の使用の遅延を修正するにはどうすればよいですか?

私のコードでは、シェーダユニフォーム/属性を知らない一般的なシェーダローダーがあります。コンパイルするだけです。そして、シェーダを予熱するのに最適な場所があるようです(したがって、どこにでもglDrawArraysを追加する必要はありません)。私は私のシェーダローダーでこれを追加しようと試み:

glUseProgram(prog); 
glDrawArrays(GL_TRIANGLES, 0, 0); 

それは遅延を固定し、私は、私はそれが安全であるかどうかわからないんだけどどんな制服/属性を設定していないよ以来。また、何とか回避策のように見えます。プログラムを予熱する最良の方法は何ですか?

答えて

2

コードはほぼ完全に安全です。ユニフォームはいくつかのデフォルト値を含んでいるので問題にはなりません。属性に関しては、頂点を放出していないので問題ではありません。

これは、シェーダを予熱する最も簡単な方法ですが、最適な方法ではない可能性があります。テクスチャを予熱するために(テクスチャキャッシュを満たすために)同様のテクニックを一度に使用しました。これは通常、出力を表示しないで数フレームをレンダリングすることによって行われました。これはUnreal Tournamentで見られましたが、レベルを読み込んだ後に「Precaching」と表示されました。私は同じことをお勧めします。

+0

シェーダの予熱について読んでいるのは初めてですが、優れた情報です。それに関する文献はありますか?それが最も役に立つでしょう。 乾杯。 –

+0

GPU関連の実装の詳細はすべてベンダー固有で機密性が高いため、実際には誰も知らないし、常に変わるため、情報は固いものではないと言いたい。しかし、キャッシュされたリソースや遅延ロードされているリソースがある場合、コンセプトは同じままです。キャッシュを満たすためにフレームをレンダリングし、リソースをロードさせます。それにはそれほど多くはありません... –

関連する問題