2017-08-13 5 views
0

人々は、OpenGLの状態を管理することが有用であると言われていました(ちょうど2001年からの記事を見ました)。この(C++)のように:OpenGLの状態をキャッシュするのはまだ理にかなっていますか?

void CStateManager::setCulling(bool enabled) 
{ 
    if (m_culling != enabled) 
    { 
    m_culling = enabled; 
    if (m_culling) 
     glEnable(GL_CULL_FACE); 
    else 
     glDisable(GL_CULL_FACE); 
    } 
} 

私は、これはOpenGLのサーバーは、OpenGLクライアントと同じ場所にいない状況で、まだ役に立つかもしれないことがわかります。しかし、それは確かに私の 'ゲーム'エンジンのケースではないので、OpenGLクライアントは常にOpenGLサーバーと同じマシンにあると仮定しましょう。

ドライバを呼び出すのではなく、すべてのチェックコードがサイクルを迎えるのはまだ価値がありますか(今は2017です)。

私はそれを自分自身でプロファイルしなければならないと言えるかもしれませんが、私の個人的なテストでは十分に表現できないようなグラフィックアダプタ、ドライバ、CPU、OSがあります。

EDIT:そして、どのようにについてのすべてのこのチェック・コードを持っているにバインドされたバッファのようなもの、フレームバッファ、テクスチャ、...

+3

それは依存します。あなたが不必要なコールをたくさんしているなら、それから恩恵を受けるでしょう。しかし、最終的には、それを "測定"するためにボウルします。他に誰もできるのはこれだけです。 – BDL

+0

あなたはまたダイレクトステートアクセスの方法を使用することができます;) –

答えて

2

が、それはまだ(それは今2017年です)です、それに値するだけのサイクルを取る代わりに、常に運転手に電話しますか?

あなたはそれがであったかのように、それは "価値がある"と言います。そうではなく、それはまだありません。少なくとも、一般にはありません。

状態キャッシングは、前の場合に役立ちます。何が起こっているのかを直接制御できないときです。

たとえば、ゲームエンジンを作成している場合、実行しようとしているレンダリング操作や実行するタイミングをしっかりと把握しています。あなたはあなたのメッシュのすべてがフェイスカリングを使用することを知っていて、それに応じてあなたのアーティスト/ツールパイプラインがそれに応じて対処します。 GUIレンダリングなどのために顔のカリングをオフにするかもしれませんが、それは特定のケースです。

対照的に、ユーザーがメッシュの性質をほぼ完全に制御できる汎用レンダリングシステムを作成している場合は、状態キャッシングが役立ちます。どのメッシュがフェイスカリングを使用しているか、どのメッシュが使用していないかがコードに伝えられている場合、そのようなことは制御できません。そして、上位レベルのコード/データはOpenGLと直接対話できないので、状況を円滑にするためにいくつかの状態キャッシングを行うことができます。

データのレンダリング方法を制御している場合、データの広範な性質と描画方法を制御すると、キャッシュは必要ありません。あなたのコードは、その仕事を適切に行います。また、優れたデータ駆動型設計では、データのレンダリングを注文して、キャッシュを必要としないようにすることができます。あなたは、外の世界がすべての州をほぼ完全に支配しており、州の変更による業績への影響をほとんど考慮していない、完全にフリーホイールのシステムでのみ必要です。

+0

それは多くの意味があります。ありがとうございました。私はあなたが完全に正しいと思うように答えを受け入れた。 – scippie

関連する問題