これは、この質問のフォローアップです。私は現在、簡単なゲームを書いていますが、ちらつきやその他のアーティファクトなしに、RGBデータの配列をWin32ウィンドウに(繰り返し)表示するための最速の方法を探しています。
前の質問への回答では、いくつかの異なるアプローチが推奨されましたが、どれが最速であるかについてのコンセンサスはありませんでした。そこで、テストプログラムをまとめました。このコードは、フレームバッファを画面にできるだけ速く繰り返し表示するだけです。
これらは、32ビットビデオモードで実行されている32ビットデータについて私が得た結果です-一部の人々を驚かせるかもしれません:
- Direct3D (1): 500 fps
- Direct3D (2): 650 fps
- DirectDraw (3): 1100 fps
- DirectDraw (4): 800 fps
- GDI (SetDIBitsToDevice): 2000 fps
これらの数字を考えると:
- なぜ多くの人がGDIがこの操作には遅すぎると固執しているのですか?
- SetDIBitsToDeviceよりもDirectDrawまたはDirect3Dを好む理由はありますか?
これは、各Direct*コードパスによって行われた呼び出しの簡単な要約です。DirectDraw / Direct3Dをより効率的に使用する方法を知っている人がいる場合は、コメントしてください。
1. CreateTexture(D3DUSAGE_DYNAMIC, D3DPOOL_DEFAULT);
LockRect(); memcpy(); UnlockRect(); DrawPrimitive()
2. CreateTexture(0, D3DPOOL_SYSTEMMEM); CreateTexture(0, D3DPOOL_DEFAULT);
LockRect(); memcpy(); UnlockRect(); UpdateTexture(); DrawPrimitive()
3. CreateSurface(); SetSurfaceDesc(lpSurface = &frameBuffer[0]);
memcpy(); primarySurface->Blt();
4. CreateSurface();
Lock(); memcpy(); Unlock(); primarySurface->Blt();