« EAccessViolationに悩む | メイン | いろいろとテスト »

2005年12月28日

吉里吉里 ムービー拡張日誌2:: 返ってこなくなる

    

IDirect3DDevice9が変更された時、IVMRSurfaceAllocatorNotify9::ChangeD3DDeviceを コールして、変更を通知する必要があるのだが、このメソッドをコールすると返ってこなくなることがある。
すでに設定されているIDirect3DDevice9と同じIDirect3DDevice9を使ってコールした場合、このメソッドを呼び出すと返ってこなくなる。
それ以外にも返ってこなくなるケースが存在するようだが、それが何かはわからない。
しかも、なぜだかMPEGを再生した時のみ発生する。
WMVの時は問題なく再生されているのにもかかわらずだ。
デコーダーがVMRに影響するとは考えづらいが、実際に発生しているので何かあるのだろう。
まあ、フィルタが違うので少しは接続方法が違ったりすると思うが。
後、デバッガでステップ実行していると起きない時もあるので、タイミングも影響してるのかもしれない。

どうも、MPEGの時は違うIDirect3DDevice9でも、描画対象ウィンドウのオーナウィンドウが同じ場合、発生するようだ。
オーナーが変わった時のChangeD3DDevice呼び出しでは問題ない。
ただし、常に発生するかと言うとそうではなく、1個目のムービーでは発生せず2個目のみ発生することもある。
バックバッファのサイズが大きいものから小さいものへ変更されるか、同じ場合、1個目のムービーでも返ってこなくなる。
どうも規則性があるようだが、完全にはわかっていない。

とりあえず、以下のような対処をすることで固まることはなくなった。
バックバッファのサイズはムービーサイズと同じサイズにする。
ただし、初回のDirect3D初期化時はサイズ不明なので、ウィンドウサイズと同じにしている。
ウィンドウ付け替えが行われている期間は描画を行わない。(この期間に描画を行い、デバイスロスト時に再構築をかけると返ってこなくなることがある)
Present時にデバイスロストして、再構築した時にエラーが発生しても通知しない。(タイミングによっては再構築が失敗することもある。ヘルプによるとこれはDirect3Dの仕様のようだ)

ただし、これらは吉里吉里のムービーに対する処理順序に強く依存している。
ウィンドウの付け替えと言う処理があるので、この辺りは仕方ない。

これでフルスクリーンとムービーの切り替えに対してはだいぶ安定してきたかな。
後テストしておいたほうが良さそうなのは・・・
・ムービー切り替え直後のフルスクリーン切り替えや、フルスクリーン切り替え直後のムービー切り替え。
・レイヤーとのミキシング。
・表示非表示の切り替え。
・ムービーサイズの変更。
・DirectX 9がインストールされていない環境での実行。
・Windows Media Player 9がインストールされていない環境での実行。
かな。
かなり頻繁に変更するようにしてテストしよう。
これらのテストがうまくいったらソースを整理してコメントをきちんと書いてからリリースかな。

異なるビデオカードによるマルチモニタ環境で、ウィンドウをモニタ間移動した場合はうまくいかないかもしれない。
ウィンドウが占めている領域が大きい方のモニタを使ってDirect3Dを初期化しているので、描画に失敗して再構築される時は違うモニタが使われるはずだから、大丈夫だとは思うが試していないので何ともいえない。
とりあえず、GeForce 6600 GTのTwinViewでの移動は問題なかった。
しかし、これはテスト環境作るのが面倒だなぁ。
まあ、気力があったらテストしよう。

環境依存のテスト以外が終わったらサンプルを公開するかな。



投稿者 Takenori : 2005年12月28日 12:30



コメント

僕のパソコンでは3Dのベンチマークソフト(FainalFantasy11,3Dmark05)やオンラインゲームを実行しているときに『IDirect3D Device9::PresentFail:Device Lost(D3DERR DEVICELOST)』と表示されシグナルロストしてしまいます。本文を読ませていただきましたが頭の悪い僕にはちんぷんかんぷんです。違う環境のパソコンでは正常に動かせるのですが、この問題は結局どうしたら改善されるのでしょうか?ビデオカードはRadeonX800GTOです。

投稿者 kaz : 2006年02月03日 19:38

kazさん、こんにちは。

このエントリとは違う問題ですね。
個別の環境については私ではわかりかねますので、メーカーに問い合わせてみるのが良いかと。

それでは。

投稿者 Takenori : 2006年02月03日 20:28


comments powered by Disqus
Total : Today : Yesterday : なかのひと