DDBにしたら劇速に

STATUS: 故障中

 DDBでサーフェイスを作るモードを追加してみました。

● 結果

Pentium4 3.06GHz + GeForceTI4200
XGA(16bit色) 790fps
VGA(16bit色) 1950fps

XGA(32bit色) 330fps
VGA(32bit色) 860fps

 …劇速です。DIBSectionのときの10倍以上の速度になりました(16bit色時)。
 うーん、グラフィックアクセラレータ様のお力を思い知りました。2Dの処理といえどもCPUでは歯が立たないのですね。
 ただ、このサーフェイスに、DIBSectionで生成したサーフェイス(256x64dot)からbitbltすると…

XGA(16bit色) 790fps ※ なし
XGA(16bit色) 70fps ※ 1個
XGA(16bit色) 35fps ※ 2個

 いきなり速度ががた落ちです。
 DIBSectionからbltするとき、転送先がDDBだった場合、一度DDBのサーフェイスをDIB(かなにかメモリ上)に転送して、blt処理をしてからまた、DDBに書き戻しているっぽいです(なんで転送元のほうをDDBに変換しないかな)。
 混ぜるな危険ということですね。
# と、この期に及んでDIB,DDBの違いのお勉強をしていていいのか?

 しかし何かメモリを直接操作するようなエフェクト(アルファ合成とかの基本的なものでも)かけながら、bltしようとすると結局は転送先のサーフェイスをメモリに転送してこないといけないのかなあ。
 となるとDirectDrawでも事情は似たようなものだろうから、ただの矩形コピー以上のことをやろうとしたらDIBSectionでやってるのと変わらない。
 しかも矩形コピーだけだったら(マスクありでも)、GDIのBitBltが十分高速なので、いまとなってはDirectDraw出る幕ないなあ。というか、もうDirectDrawなんか無いか。
 DirectXは3Dのモードに一本化しちゃったもんな。

【補足】
 SDLでも、似たようなプログラム作って試してみたけど、こっちはXGAサイズ16bit色で、60fpsしかでない。
 サーフェイス作成時に、SDL_HWSURFACEを指定してもSDL_SWSURFACEを指定しても結果が同じなんで、SDL_HWSURFACEが効いていないぽい。なんでだろう。
 

コメント