5

私は現在、簡単なゲームを書いています。私のグラフィックコードはフレームごとに1回(1秒間に約30回)実行され、670 * 480=307200エントリの配列にRGBデータを書き込みます。

正確に640x480ピクセルのサイズのクライアント領域を持つWin32ウィンドウを作成しました。空のウィンドウ内にRGBデータを表示するための最速の方法は何ですか?

ウィンドウはフレームごとに更新する必要があるので、ちらつきを避ける必要があります。これにはGDIを使用する必要がありますか?または、別のライブラリ(DirectDrawなど)を使用したより高速なアプローチはありますか?

編集:

すべての返信をありがとう。まず、オプションとしてDirect2Dを除外します。WindowsXPをサポートする必要があります。第二に、私は3Dのバックグラウンドを持っているので、YannRaminとBenVoigttoによって提案された方法(Direct3D / OpenGLと単一のテクスチャクワッドを使用)は、これまで常にこれを行ってきた方法です。

しかし、2DAPIがより良いソリューションになるかどうかを知りたいと思いました。明確な答えがないので、テストプログラムをまとめました。このコードは、フレームバッファを画面にできるだけ速く繰り返し表示するだけです。

このフォローアップ質問の一部として結果を投稿しました。

4

4 に答える 4

3

GDI を使用SetDIBitsToDeviceしてできる最善の方法は、RGB データを配列からウィンドウに直接コピーすることです。もちろん、ちらつきを完全になくす必要がある場合は、DirectX が最適です。

于 2010-11-08T01:01:21.020 に答える
1

GDIは絶対に行くべき道ではありません。

クロス ウィンドウ バージョンの最適な方法は、Direct3D を使用し、単一の全画面クワッドでテクスチャを単純に更新することです。

Direct2D は新しい API (Win Vista with Service Pack 以降) であり、XP をサポートする必要がない場合に推奨されるメカニズムです。Direct2d は、フォントやその他のシステム レベルのタスクを高速に処理します。

于 2010-11-08T00:57:42.050 に答える
1

GDI 関数SetDIBitsToDeviceは正常に動作します。

theatrus で提案されているクワッドのテクスチャリングも同様に機能しますが、フルスクリーンである必要はなく、OpenGL が断然最も移植性の高いオプションです。これを実現するには、glTexSubImage2Dを参照してください。

もっと直接的な方法はglDrawPixels です

ただし、理想的には、グラフィックス コードで GPU アクセラレーションによるレンダリングを直接 GPU メモリに使用することができれば、システム メモリから GPU へのビットの移動について心配する必要はありません。

于 2010-11-08T01:02:43.703 に答える
1

DirectDraw を使用します。GDI を使用したときにピクセル描画でボトルネックになったフルスクリーンのライフ ゲームがあり、DirectDraw に切り替えた後、60 fps を簡単に送り出し始めました。

于 2010-11-08T01:04:29.223 に答える