楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル

log

2012.02.25 C++:またですか、デバイスロストさん。。

ほんと、見えないときは全く姿を現さないですが。見えるときになってからがやっかいですね、
デバイスロストさん。というのも自身のプログラムをWindows7+オンボードGPUの環境で
プレイしてみたのですが、プレイ自体は何も問題ないものの、スリープモードから復帰した
ときにデバイスロストの復旧が正常に行えないという問題に直面したわけです。
以下、メモ書き風に話がグダグダと続きます。プログラム周りに興味のある方だけどうぞ苦笑;

さて、コードを見渡しても復旧前に開放し忘れたりとかは無い…(まぁ、XPで動作出来てる
のでこれは当たり前だろうなと思ってましたが)。しょうがないのでネット上にあるマルペケ
さんの所のデバイスロストのサンプルを実行してみるとこれも復旧できず、、「んっ?」て
思いました。コードを削っていくとどうやらD3Dデバイス作成時にD3DCREATE_SOFT
WARE_VERTEXPROCESSINGを指定するとデバイスロストから復旧できるということが
分かり、オンボだとHARDWAREで指定しちゃいかんのかなとも考えましたが、指定でき
ないのにデバイスの作成が通るというのもおかしいのでもう少しだけ考えることにしました。

そこで、サンプルコードから一旦自身のプログラムに戻って修正してみると、デカール描画
の部分だけデバイスロストから復旧時に不自然な描画の仕方をする現象を見つけました。
デカール描画の部分だけDrawIndexedPrimitive()ではなくDrawIndexedPrimitiveUP()
で描画していたので、これはすぐにピンと来たわけです。
つまり、「Windows7は内部でDirectX10.1を使っているし、DirectX10ではUP系の
描画を廃止してるんだからこれはうまくエミュレートできていないってことだろうな」と思った
訳です。で試しにデバイス作成部分を元に戻してDrawIndexedPrimitiveUP()部分を
コメントアウトしてみるとデバイスロストの復旧が無事出来ました!(要追伸)

ちなみにマルペケさんのサンプルがデバイスロストから復旧出来なかったのはソース
コードの短縮のためにD3DXSPRITEやD3DXFONTを使っていたのでこれが原因みたい
でした(おそらく内部でUP系の処理をしているのかな)。デバイスをSOFTWAREで作成した
時にうまくいったのも、予想の域を超えませんがオンボではなくCPU側で頂点処理をエミュ
レートしたのがうまく働いたのかな。

この問題はオンボGPUのサポートの不手際が悪いとも言えそうですが、結論から言えば
「UP系描画はこの先どう描画されるか分からないから使うな」という警告だなと思いました。
いっそオンボは無視するというのもアリですが。最近のオンボは結構早いですからね。
、、それにしても結論までに結構時間かかったなぁ;

追伸:
UP系命令が原因と書きましたが、デカール描画だけはボリュームテクスチャで描画して
いたので、こっちが原因かもしれないなと思いDrawIndexedPrimitiveUP()を消さずに
ボリュームテクスチャをOFFにすると正常に描画されました。で試しにボリュームテクスチャ
のプールをD3DPOOL_MANAGEDだったのをD3DPOOL_DEFAULTにして自前復旧に
変更することでデバイスロストに対処できました。…ということで、間違った情報を流して
しまいました。そういいつつ、直った理由がいまいちよく分からない上にUP系との併用に
よるバグかもしれないし、デカールと一部分だけ固定パイプラインで描画していることによる
バグかもしれない。原因は何だか特定しきれないですが、、直ったからいいんです苦笑。

comment

たけなか 2012.02.28-00:30 Edit

さらに色々と検証してみました。

UP系描画・固定パイプライン自体による不都合は特に無し。
で以下のように、ボリュームテクスチャに限りプール場所を色々変えると
何故か挙動がすごく変わるという謎の仕様です。
D3DPOOL_SYSTEMMEM:Windows7+オンボGPUでは1FPSを
切る位重くなる。
D3DPOOL_MANAGED:デバイスロストから復旧はされる。が、何故
かテクスチャの参照が別のテクスチャになっていたりする。

D3DPOOL_MANAGEDでもロスト時に自前で復旧させることで正常に描画
できたんですが、とっても怪しい仕様だったのでボリュームテクスチャだけは
D3DPOOL_DEFAULTを使用することにしました。

それにしても謎…。テクスチャの参照が変わるってことはボリュームテクスチャ
だけCOMポインタの参照カウンタが正常に機能していないという可能性が
あるかもと思ってプログラムを見渡して見たけどおかしいところが無いし、
やはりオンボのバグだなこれは。

post your comment

投稿フォーム
name
mail
url
comment
icon
アイコン一覧
del key