0

私たちのインターネットで組み立てられたチームがプログラミングしているゲームでは、視聴者全員がゲーム内で全速力を超えていると想定しています。

したがって、ビデオ RAM を節約し、できればグラフィック カードのアイドル時間をもう少し増やすには、ダブル バッファリングなしで V-sync を使用するのが最善の選択肢です。したがって、OpenGL では、その方法を知る必要があります。

私の理解では、V-sync とは、グラフィック カードが 1 つのフレームのレンダリングを完了してから、そのフレームがディスプレイ デバイスに送信されるまで一時停止することです。ダブル バッファリングは、レンダリング操作を一時停止しません (または、一時停止するか、または実装固有である可能性があります。不明です)。これは、代わりに、フレーム バッファーにコピーする前に 2 番目のバッファーに描画するため、モニターがフル フレームを取得するか、またはまったく取得しないためです。新しいフレーム (具体的には、フレーム バッファに最後に保存された画像)。グラフィックカードが必要なときにのみフレームバッファに書き込む限り、その機能は必要ありません。

これはかなり遅いオンライン ゲームです (しかし、非常にクリエイティブです ^_^)。リアルタイムのアクションはほとんどありません。したがって、非常に正確なユーザー入力は必要ありません。フレームをレンダリングする前に、いつでも OS から単一のユニットとしてキャプチャできます。

したがって、これを正確に行うには、OpenGL から「フレームがモニターへの送信を終了しました」というメッセージを取得できる必要があります。出来ますか?そうでない場合、最良の代替手段は何ですか?

ゲームは現時点では Windows 用にのみプログラムされていますが、数か月以内に Linux 用に作業が完了するはずです。

4

2 に答える 2

9

あなたは、V-Sync が何をするのかという誤解に苦しんでいます。ビデオ RAM には、フレーム リフレッシュ レートという一定のレートでディスプレイ デバイスに継続的に送信される部分があります。そのため、完全なフレームが送信された直後に、次のフレームが非常に短い空白時間の後に送信されます。ただし、フレーム送信間の時間は、完全なフレームを送信するのにかかる時間よりもはるかに短いです。

V-Sync がないと、フレームバッファのコンテンツに対する操作が表示されます。たとえば、フレームが赤と緑で交互に塗りつぶされ、V-Sync がない場合、モニターに赤と緑のバンドが表示されます。これを回避するために、V-Sync は、完全なフレームが送信された直後に、ディスプレイ ドライバーがフレーム バッファーにアクセスするために使用するポインターを交換します。

これにより、ダブルバッファリングが行うことになります。ダブルバッファリングがなければ、V-Sync はほとんど役に立ちません。V-Sync によってトリガーされるアクションは、非常に高速に実行する必要があります。したがって、これはポインタのスワップまたは非常に高速なブリッティング操作に要約されます (GPU の MMU に CoW 属性を設定するだけで可能性があります)。

ダブルバッファリングと V-Sync がなければ、画像がフレームバッファに 1 つずつレンダリングされるプロセスを確認できます。もちろん、レンダリングがフレーム期間よりも速く行われる場合、これはトップダウンで、下に向かってより多くのコンテンツが表示されるまばらな画像のみが表示され、その間のどこかで画面の下端に到達するという効果があります。上までぐるぐる回る。交線が移動します。

TL;DR: ダブル バッファリングを使用し、V-Sync を有効にしてバッファ スワップを行うだけです。メモリ消費を恐れないでください。現在流通しているすべての GPU には、ダブルバッファリングされたカラー プレーン用のメモリを簡単に提供するのに十分な RAM が搭載されています。計算するだけです: 1920x1200 * RGB = 6MiB。今日の PC の最小の GPU でさえ、少なくとも 128MiB の RAM を提供します。モバイル デバイス、たとえば iPad 1024*768 * RGB = 2MiB 対グラフィックの 32MiB とします。とにかくiPadのUIはダブルバッファです。

于 2011-02-04T08:49:57.157 に答える
1

を使用wglGetProcAddressして のアドレスを取得し、wglSwapIntervalEXTを呼び出しwglSwapIntervalEXT(1);て更新を垂直同期と同期できます。これを行うと、垂直同期でメッセージが表示されません。代わりにglFlush、垂直帰線が発生して画面が更新されるまで戻りません。したがって、次のWM_PAINTようなハンドラーがあります。

BeginPaint
wglMakeCurrent
do drawing
glFlush
EndPaint

いずれにしても、作成したglFlush描画が画面に確実に送信されるようにするために必要です。

于 2011-02-04T07:00:44.840 に答える