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が効いていないぽい。なんでだろう。