トップページ > 過去ログ > 記事閲覧
DirectXの描画スピードについて
名前:dic 日時: 2011/03/24 18:23

DxLibを使わせてもらってます そこで、ScreenFlip() 関数が異常に時間がかかり 通常だと60FPSでるのですが ここだけの処理で 40FPSくらいしかでなくなってしまいます SetUse3DFlag( FALSE ); も試してみたのですが、よけいに遅くなりました 2Dしか使わないのですが、2Dに特化したDxLibなどは 作れないのでしょうか?

Page: 1 |

Re: DirectXの描画スピードについて ( No.1 )
名前:dic 日時:2011/03/24 19:39

SetWaitVSyncFlag関数を使用することで対応できました
Re: DirectXの描画スピードについて ( No.2 )
名前:いっち 日時:2011/03/24 21:01

解決されたとの事ですので今更ですが、事象の再現するコードをご提供頂けますでしょうか?
Re: DirectXの描画スピードについて ( No.3 )
名前:がもん 日時:2011/03/24 21:39

先日ちょうど私も同じ現象が起きましてバグとして報告しようと思っていたのですが、 その時はDxLib_Init()の前にSetDrawScreen(DX_SCREEN_BACK)を行ったら ScreenFlip()が異常な重さ(17msecほど)になりました。 順番を逆にしたら正常に動作しました。
Re: DirectXの描画スピードについて ( No.4 )
名前:管理人 日時:2011/03/27 17:35

> 2Dしか使わないのですが、2Dに特化したDxLibなどは > 作れないのでしょうか? DirectX11 では Direct2D という2Dに特化した機能がありますが、それは WindowsXP では 使用できないので( WindowsXP で DirectX11 が使えないため )、WindowsXP でも使えるように使用とすると DirectX9 を使う必要があります( WindowsXP で対応しているのは DirectX9 までである為 ) そして、DirectX9 には2Dに特化した機能がないので、3D用の機能を使って2Dの描画処理を行います なので、現状では今以上に「使用する DirectX の機能を2Dに特化させる」ということはできません ( もしDXライブラリが提供する機能を2Dに特化したものにして欲しい、ということでしたら、 現状でも十分DXライブラリは2Dに特化していると思います・・・ ) SetWaitVSyncFlag( FALSE ) ; を使用しないと40FPSになってしまうというのは気になります・・・ いっちさんも仰られていますが、よろしければ現象を再現できるプログラムをこちらに貼り付けていただけないでしょうか? > がもんさん DxLib_Init を呼ぶ前は SetDrawScreen を呼んでも効果はありませんので、DxLib_Init の前で SetDrawScreen を呼んだ場合は 結果としてデフォルトの設定である表画面に描画することになります DirectX9 では表画面に直接描画するということができないので、実は使用する DirectX を DirectX9 にした Ver3.00 以降の DXライブラリでは表画面を描画するという設定になっていても実際には裏画面に描画しています、そして、 一定時間( 32ミリ秒 )毎に ScreenFlip を内部で実行することで表画面に描画した場合と同じように 「ScreenFlip をしなくても描画結果がモニタに表示される」ようにしています ScreenFlip は裏画面の内容を表画面に反映する機能ですが、デフォルトでは転送のタイミングはPCモニタの更新直前にくる VSYNC( 垂直同期信号 )を待ってから転送することになっています VSYNCはモニタのリフレッシュレートの設定を 60Hz に設定している場合一秒間に60回発信されますので、 この場合デフォルトの設定では ScreenFlip をどんなに高速で何回呼び出しても最大で一秒間に60回しか画面の更新ができないということになります そしてこの場合、( VSYNC を待つ処理は Direct3D9 の機能なので推測になってしまいますが ) ScreenFlip が60分の一秒以内に2回以上呼ばれた場合は 2回目は次の VSYNC が来るまで待ちます( 多分 ) これは一回目は「次に VSYNC が来たら裏画面の内容を表画面に転送するという『予約』」をしてすぐ ScreenFlip から出てくるのですが、 2回目は既に次の VSYNC 分の転送の予約がされてしまっているので、予約が空くまで ScreenFlip の中で待たされるのだと思います 予約が空くのは次の VSYNC が来て、既に予約されている分の「裏画面の内容を表画面に転送する」が行われた後ですので、 ScreenFlip はこの「待ち」が必要になった場合最大で 60分の一秒( 16.66666...ミリ秒 )関数から出てこないことになります 表画面が描画先になっている場合はDXライブラリ内部でも定期的に ScreenFlip が行われますので、 ScreenFlip を呼び出した際のこの「既に予約が入っていて ScreenFlip 内で待たされる」現象が発生しやすくなり、 結果として ScreenFlip の前後で経過時間を計測すると 17msec 程になってしまうのだと思います

Page: 1 |