Re: ScreenFlip 内部のSleepについて ( No.1 ) |
- 名前:管理人 日時:2010/07/11 14:03
WaitVSyncFlag を FALSE に設定してある場合は ScreenFlip 内で Sleep を行うことはありません
なので、単純に ScreenFlip がそれなりに重い処理だということになります
( 私の手元で 640x480 の裏画面を表画面に転送する処理だけで 1.6ms かかっていました )
WaitVSyncFlag を TRUE にしていた場合は「次のVSYNCが来る3ms前まで Sleep する」となっています
> 今後、通信などを別スレッドで処理する予定なのですが、
> Sleep時間は多いほど、他スレッドに優しくなるんですよね?
はい、そうだと思います
> 動画を見ながらプレイしたりすることを考えると、
> ソフト自体が軽くなるなら、なるべくSleep時間を多く取りたいと思いました。
動画を見ながらプレイというのは考えたことがありませんでした(^ ^;
それでしたら最高30fpsの方が良いかもしれませんね
|
Re: ScreenFlip 内部のSleepについて ( No.2 ) |
- 名前:バトーキン 日時:2010/07/11 23:56
回答ありがとうございます。
>WaitVSyncFlag が FALSE の時はSleepしない。
了解です。ただ重いだけなんですね。
これは、まったく緊急性のない、素朴な疑問なんですが……、
上記事で公開しているプログラムは、
[Q]キーで、デバッグ用の情報表示を5段階で切り換えます。
これに、1〜4番には、DrawSphere3D をたくさん繰り返して、
だんだん負荷をかけていくようにしています。 FPSの低下を体験するためなんですが。
で、DrawSphere3D を繰り返して負荷をかけていくと、
全体の処理時間が増えるにつれて、ScreenFlip にかかる時間が減っていくんです。
これが理由で、処理時間に合わせて Sleepしてるんだと思ってたんですが、
Sleep じゃないとなると、どういう原理が考えられるんでしょう?
ただの興味で、実用上に何も問題はないんですけど。
>動画を見ながら
作ろうとしているのがチャットソフトなのと、
活動場所がニコニコなもので、どうしてもそんな感じにw
|
Re: ScreenFlip 内部のSleepについて ( No.3 ) |
- 名前:管理人 日時:2010/07/15 09:12
私も DrawSphere を使用した方が負荷が小さくなるのを確認してみました
推測ですが、ScreenFlip が使用している Direct3D 側の処理はメインスレッドと
平行して動作している Direct3D のスレッドで動作しているので、ScreenFlip から
出てきた時点では処理が完了していないのだとと思います
そして、並行して行われている ScreenFlip が利用している Direct3D 側の処理が
終了する前に再度 ScreenFlip が呼ばれた場合は、前回の ScreenFlip が
使用している Direct3D の処理が終了するまで待たされるのだと思います
なので、DrawSphere3D を使用することで ScreenFlip が呼ばれる間隔が長くなると
前回の ScreenFlip の処理が終了するのを待たされる時間が短くなるので、
結果として ScreenFlip に入ってから出てくるまでの時間が短くなるのだと思います
Direct3D の中の処理まで調べたことがないのであくまで推測ですが・・・
|
Re: ScreenFlip 内部のSleepについて ( No.4 ) |
- 名前:バトーキン 日時:2010/07/16 16:10
>ScreenFlipから出てきた時点で完了していない
なるほどー、そんな現象が起きることがあり得るんですね。
やっぱり、何処かが軽くなるわけはないのですね。
満足しました。
検証ありがとうございます <( _ _)>
|