DirectX on WindowsMobille5.0

W-ZERO3[es] で、アニメーション用のフレームワークを作ってみました。

まずは、GDI で作ってみて、遅かったので DirectDraw に作り変えて…、ここまでは、まあ、想像の範囲内。次は、フレーム毎に全画面消去してオブジェクトを書き直して…やっぱりフリッカが出るなぁ。これも想像の範囲内。んで、ここからが本題。

フリッカが出るなら、ダブルバッファリングしかないなぁと Page Flipping を実装。50FPS出ませんがな。そのままなら250FPSとか出るのに。まぁ、VGAなので仕方ないかとあきらめて、シングルバッファ+V-Syncで何とかすべいと、DirectDraw のヘルプを追いかけてみると…ありまんがな。

IDirectDraw::GetVerticalBlankStatus
IDirectDraw::WaitForVerticalBlank
IDirectDraw::GetScanLine

それらしい API を3つも発見。しかし、実際動かしてみたら、こいつら全部「NOT IMPLEMENTED」。あほかぁ。どないせいっちゅーんじゃぁ!


まぁ、騒いでも解決しないので、他の方法を探してみるが、 V-Blank が取れる方法が見つからん。

W-ZERO3[es]って Intel PXA250 だから、DirectX ドライバも、Intel のリファレンスドライバを使っていると勝手に想像しますが、違うんでしょうか。リファレンスドライバを使っているってことなら、オイラの考え方がおかしい確率が一気に上昇してしまうんですが。

そもそも論から考え直してみると…

・液晶画面を使っているので、VRAMと画面がダイレクトに繋がっていれば、走査は発生していないはず。
→普通にScanしてますがな。http://document.sharpsma.com/files/LS037V7DW01_SP_051706.pdf
・Scanしてるってことは、VBLANKを「使うな」と言っているようなものなのか?
・確かに、DirectDraw経由でBltすると、VSYNC待ちののオプションがあるので、これを使えばScanと同期はとれるが、逆に言えば、これを使わないと出来ないってことになる。
→例えば、1pixelをBltして、WAITVYSNCで待てば、VBLANK+αタイミングが取れそうだが、本当にそうなるのか?

むむぅ。実験してみるか。
スペックシートによれば、総ScanLine数は648ライン。1S/648=1.5432ms/line。Blank期間は全部で1.5432x8ラインで、12.3456ms。なんとかなりそうな気はするが…


結果…
ダメでした。

 1x1のピクセルをWAITVSYNCでBltしてみました。Bltの前後にQueryPerformanceCounterで経過時間を計測してみましたが、約200μsで安定して帰ってきます→WAITVBLANKしてないと見られます。

 さてどうしたもんだか。