D3DCREATE_MULTITHREADED の重要性について僕は声を大して言いたい。 | ゲームプログラマ志望が福岡で叫ぶ 『絶望』

ゲームプログラマ志望が福岡で叫ぶ 『絶望』

プログラマーになりたい!!!!! あ、風のうわさで聞いた最近若者で流行っているトゥイッターなるものを始めてみました (・ト・) @toshi_desu_yo

さぁ やって来ました見てらっしゃい。



DirectShow のエラー報告ですよ!





DirectShow を


【Release】【64bit】ランタイム で

【D3DPOOL_DEFAULT】【D3DUSAGE_DYNAMIC】
で動的テクスチャにして


ムービーをテクスチャに貼り付けると・・・






メモリアクセスエラーが出た。


もし、テクスチャが【 D3DPOOL_MANAGED 】だとメモリアクセスエラーは出ない。



しかし、

前日
動画は動的テクスチャのほうが良いと学んだばかり。



ずっと D3DPOOL_MANAGED で作ってきた DirectShow を改造しようとしたらダメでした。



何がダメなの-・・・ ( ゚д゚)、ペッ 

っと心麗しく悩んでいました。



『1920x1080 のムービーでフルスクリーンだから無理なのかな・・・』


と思い、ウィンドウモードでしてもダメ。  神は無慈悲なり・・




しかし、、、、




サンプルは同じ設定で出来た。
↑ココ重要。




 で き ん の か よ( ゚Д゚)

希望の光どころか自分の情けなさに涙がちょちょぎれた。




で、さんざん悩んだ所・・・





サンプルの CreateDevice の所で見慣れないものが・・・



g-pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 
D3DCREATE_SOFTWARE_VERTEXORICESSING | D3DCREATE_MULTITHREADED , &d3dpp, &d3dDevice );




ん???


D3DCREATE_MULTITHREADED


??????


調べてみると



『マルチスレッドを安全に行うフラグ』

らしい。


マルチスレッド? 使ってないよ。


と思い、 何故か SOFTWARE の方に目が行き、 


『えー・・・  HARDWARE じゃだめなのか・・・』


と、勘違いして → 実行 ↓



   落  ち  る




( ‘д‘⊂彡☆))Д´) パーン



そうですね。 D3DCREATE_MULTITHREAD を指定するのが正解みたいです。


おそらくは DirectShow はどこかでマルチスレッドをしやがってて、



"描画がまだ完全に成功していない"のにテクスチャを触ってるからメモリアクセスエラーが出ていた。


と考えるのがしっくりちっくりちくびんびん来ました。




D3DCREATE_MULTITHREADED


は 『マルチスレッドを安全に行う』フラグ。



恐らく、

描画時等でテクスチャを触ってる時は、 テクスチャLOCK を自動的に待ってくれるのでろでろ。

だからテクスチャ書き換え時、メモリアクセスエラーが出ない。




あー・・・ なるほど・・・・


そう思った。 それだけです。


ここは見てなかった _| ̄|○




--------------------【追記】--------------------

なんで D3DPOOL_MANAGED だとメモリアクセスエラーが出ないか考えてみた。



D3DPOOL_MANAGED
 VRAMにも、システムメモリにもリソースを取る。



つまり、、




描画時はVRAMを使っている。


そして、


テクスチャ書き換え時はシステムメモリのリソースを使っており、
書き換え終了後、 システムメモリのリソースをVRAMに移してる。 → そして描画。



D3DPOOL_DEFAULT は VRAM にしかリソースを取らない。
   → 同じ所を触ろうとするので、描画中にもかかわらず
      テクスチャを書き換えようとアクセスしてエラーなう!!





マルチスレッドを美味くかわしてやがるぜこいつ!!( ゚д゚ )





考えてみたらなんてことなかったけど、今までは危ない橋を渡っていたんだな・・・


やっぱりリソース管理を勉強してよかった。







【結論】


やっぱり D3DPOOL_MANAGED より、 D3DPOOL_DEFAULT の動的テクスチャにしたほうがパフォーマンス良くなりました(笑)