私は SDL の初心者で、これまでに約 12 の入門チュートリアルを読みました。ハードウェア サーフェスとソフトウェア サーフェスの違い (つまり、SDL_SetVideoMode() の呼び出しにおける SDL_HWSURFACE フラグと SDL_SWSURFACE フラグ) と、サーフェスの種類ごとに SDL_UpdateRect() がどのように動作するかについて、少し戸惑っています。私の理解では、ハードウェア サーフェスの場合、表示画面に直接描画しているため、SDL_UpdateRect() を呼び出す必要はありません。ただし、この Wikibooks チュートリアル ( http://en.wikibooks.org/wiki/SDL_%28Simple_DirectMedia_Layer%29 ) の例では、ハードウェア サーフェスで SDL_UpdateRect() を呼び出しています。
2 に答える
ハードウェア サーフェスとソフトウェア サーフェスの違いについて少し戸惑っています (つまり、SDL_SetVideoMode() の呼び出しにおける SDL_HWSURFACE フラグと SDL_SWSURFACE フラグ)。
SDL のドキュメント、AFAIK では、ソフトウェア サーフェスはシステム メモリ (コンピューターの RAM) に格納され、ハードウェア サーフェスはビデオ メモリ (GPU RAM) に格納され、ハードウェア サーフェスはハードウェア アクセラレーションを利用できると単純に述べています (以下を参照)。 SDL_Flip)。
ドキュメントにはあまり書かれていませんが、違いがあります。たとえば、アルファ ブレンディングを使用する場合、ソフトウェア サーフェスはハードウェア サーフェスよりもパフォーマンスが優れていることがわかっています。直接ピクセルにアクセスするには、ソフトウェア サーフェスの方が優れているとも聞きましたが、確認できません。
SDL_UpdateRect()が各タイプのサーフェスに対してどのように動作するか
どちらの動作も同じです。関数は、指定されたサーフェス内の指定された長方形を更新します。おそらく、実装に関しては違いがあるに違いありませんが、ドキュメントにはそれについて何も記載されていません。
SDL_Flip の場合は別の話です: ハードウェア サーフェスで使用すると、ビデオ バッファを交換しようとします (ハードウェアがダブル バッファリングをサポートしている場合にのみ可能です。SDL_DOUBLEBUF フラグを SDL_SetVideoMode に渡すことを忘れないでください)。ハードウェアがダブル バッファリングをサポートしていない場合、またはソフトウェア サーフェスの場合、SDL_Flip 呼び出しは、SDL_UpdateRect (SDL_UpdateRect(screen, 0, 0, 0, 0)) でサーフェス領域全体を更新することと同じです。
私の理解では、ハードウェア サーフェスの場合、表示画面に直接描画しているため、SDL_UpdateRect() を呼び出す必要はありません。
いいえ、ソフトウェア サーフェスと同じように呼び出す必要があります。
また、SDL_UpdateRect と SDL_Flip 関数のサーフェス パラメータに選択された名前は、少し誤解を招く可能性があることに注意してください: パラメータ名は screen ですが、任意の SDL_Surface にすることができます (ユーザー スクリーンを表すサーフェスだけではありません)。ほとんどの場合 (少なくとも単純なアプリケーションの場合)、スクリーン サーフェスでのみブリットしますが、ユーザー スクリーン以外の他のサーフェスでブリットすることは理にかなっています (必要な場合もあります)。
SDL_UpdateRect()は、サーフェスタイプとは関係ありません(SDL OpenGLを使用する場合は使用しないでください)。SDL_Surfaceの(一部)を更新する必要があるときはいつでも、これを呼び出す必要があります。実際、サーフェスを反転するたびに、そのサーフェスに対してaSDL_UpdateRect(screen, 0, 0, 0, 0)
が呼び出されます。