トップページ > 過去ログ > 記事閲覧
ScreenFlip 内部のSleepについて
名前:バトーキン 日時: 2010/07/08 01:17

いつもお世話になります。 先日の話題の続きなのですが、スレッドを分けさせていただきます。 ここで教えていただいた、可変FPSを実装してみました。 www.nicovideo.jp/watch/sm11298624 www1.axfc.net/uploader/H/so/110450.zip&key=niconico 60fps以上に回転数が上がっても、あまり意味がないように思ったので、 Sleepで調整するようにしました。 この中で、1フレームにかかる処理時間を細かく調べていたのですが、 最も時間を使っていた処理が、ScreenFlipでした。 ( WaitVSyncFlag は FALSE です ) そこで、過去ログを調べて、こちらの記事に行き着きました。 hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=1167 おそらくこの記事に書かれているのと同じ内容の話だと思いますが、 ここに書かれている、ScreenFlip 内で Sleep される仕様というのは、 WaitVSyncFlag が FALSE でも同じ動作なのでしょうか? 他の処理で、1フレームあたりの時間が圧迫されていった場合、 内部Sleepの時間は調整されて、減っていくのでしょうか? あと、余談ですが、fpsについてのお話の続き。 今回は最高60fps になるように可変率を調整しましたが、 これを、最高30fps で調整してもいいかなーと思っています。 今後、通信などを別スレッドで処理する予定なのですが、 Sleep時間は多いほど、他スレッドに優しくなるんですよね? 動画を見ながらプレイしたりすることを考えると、 ソフト自体が軽くなるなら、なるべくSleep時間を多く取りたいと思いました。

Page: 1 |

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から出てきた時点で完了していない なるほどー、そんな現象が起きることがあり得るんですね。 やっぱり、何処かが軽くなるわけはないのですね。 満足しました。 検証ありがとうございます <( _ _)>

Page: 1 |