4

私は現在、学校のプロジェクトで初めての 3D ゲームを開発しています。ゲームの世界は完全に Minecraft にインスパイアされています (世界は完全に立方体でできています)。私は現在、頂点バッファー オブジェクトを実装しようとしてパフォーマンスを改善しようとしていますが、行き詰まっています。このメソッドは既に実装されています: フラスタム カリング、露出面のみの描画、および距離カリングですが、次の疑問があります。

  1. 現在、私の世界には約 2^24 の立方体があり、16*16*64 の立方体の 1024 チャンクに分割されています。現在、フラスタム カリングでうまく機能する即時モード レンダリングを行っています。チャンクごとに 1 つの VBO を実装すると、カメラを移動するたびにその VBO を更新する必要があります (視錐台を更新するため)。これでパフォーマンスに影響はありますか?

  2. 各 VBO のサイズを動的に変更できますか? それとも、それぞれを可能な限り最大のサイズ (オブジェクトで完全に満たされたチャンク) にする必要がありますか?

  3. 訪問した各チャンクをメモリに保持する必要がありますか、それともその VBO を効率的に削除し、必要に応じて再作成できますか。

4

2 に答える 2

2
  1. カメラの錐台を変更するたびに VBO を変更することは、あまり良い考えではありません。データを継続的にバッファリングすることによるオーバーヘッドは、描画するポリゴンの数を減らすことで得られるパフォーマンスの向上を上回る可能性があります。VBO が錐台から完全に移動する場合は、VBO 全体をカリングする方がよいでしょう。厳密に必要な数よりも多くのポリゴンを描画することになりますが、VBO からの描画は即時モードでの描画よりも大幅に高速であるという事実によってバランスが取れています。
  2. VBO のサイズを変更することはできglBufferDataますが、データをグラフィック カードに送信している場合、高価な呼び出しになる可能性のある新しい呼び出しを行うことによってのみ可能です。
  3. VBO を作成したすべてのチャンクをメモリに保持しないことをお勧めします。これはすぐに手に負えなくなります。身近な環境を記憶に留めておき、離れたときにそれらを破棄するのが最善の策です.
于 2011-11-29T18:52:41.657 に答える
2
  1. 最初の素朴な (必ずしも悪い意味ではない) アプローチは、錐台と隠れた顔のカリングの結果に基づいてフレームごとに VBO を更新することです。これは悪いことのように聞こえるかもしれませんが、immediate モードを使用しても実際には同じこと (フレームごとに各頂点を GPU に送信する) が行われることに注意してくださいglVertex。シングルドローコール。

    したがって、VBO を使用すると (もちろん、GL_DYNAMIC_DRAWまたは を使用してもGL_STREAM_DRAW)、おそらく即時モードよりも高速になります。これは、可能な GPU ストレージだけでなく、VBO (または一般的には頂点配列) を即時モードよりも高速にするドライバー呼び出しの数の減少でもあります。

    後で、トランスフォーム フィードバックを使用して、より洗練されたハードウェア カリング手法を実装することもできます。これにより、GPU で直接カリングを行うことができ、フレームごとに頂点データを GPU に送信する必要がなくなります。

  2. いずれにせよ、フレームごとにバッファ全体を更新するため (したがって、 を呼び出す必要がありますglBufferData)、サイズ変更はまったく問題ありません。glBufferData別のサイズでもう一度呼び出してください。

  3. それはあなたが持っているチャンクの数に依存します。しかし、それらの数が大きくなった場合は、キャッシング テクニック (遠く離れた VBO を削除し、距離をカリングし、チャンクを分割する) を使用することをお勧めします。

于 2011-11-29T18:55:53.593 に答える