チケット #23568

ウインドウ非フォーカス時のFPS向上

登録: 2010-11-02 03:11 最終更新: 2011-04-03 04:36

報告者:
(匿名)
担当者:
チケットの種類:
状況:
完了
コンポーネント:
マイルストーン:
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし
投票
点数: 0
No votes
0.0% (0/0)
0.0% (0/0)

詳細

非フォーカス時FPSががくっと落ちるのを改善して欲しい。

チケットの履歴 (17 件中 3 件表示)

2010-11-02 03:11 更新者: None
  • 新しいチケット "ウインドウ非フォーカス時のFPS向上" が作成されました
2010-11-02 03:15 更新者: yyagi
コメント

しまった、匿名で発行してしまった・・・

それはさておき、こいつの改善対応ができたのですが、需要ありますか?

昔々にこういうリクエストがあったように記憶しているのですが、実際のところ需要があるかどうか、ご意見いただけますと幸いです。

2010-11-02 07:18 更新者: from
コメント

非フォーカス時に FPS が落ちるのは、単に SlimDX のサンプルアプリを真似てわざと実装されたものなので(sleepしてる)、Config.ini に sleep 値を指定するだけの簡単な実装ですむかと思います。

最近の高性能な PC では、非アクティブの状態で CPU や GPU をガンガン使われても、特に問題ないでしょう。 というか、むしろ、動画キャプチャの関係で、非フォーカス時にもスムーズに動いたほうが都合のいい方もいらっしゃると推測します。 昔のバージョンではウィンドウの移動中などでもお構いなくスムーズに動いていたりしたのですが、まぁそこまでは求められないでしょう。

なので、数値可変での実装には賛成です。 (だったら自分で実装しろという至極真っ当なご意見はひとまず置いておいて(汗))

2010-11-02 08:10 更新者: ikanick
コメント

需要あります、実装に賛成です。fromさんの仰る数値可変での実装はかなり便利だと思います。 スペックに応じると思うので。思うので。

>(だったら自分で実装しろという至極真っ当なご意見はひとまず置いておいて(汗)) 同上ですo

2010-11-02 09:05 更新者: from
  • マイルストーン(未割り当て) から 新機能の追加 に更新されました
2010-11-02 21:01 更新者: from
2010-11-03 23:21 更新者: yyagi
  • 担当者yyagi から ikanick に更新されました
コメント

了解です。それでは ikanickさんに実装していただくことにしましょうw

以下、ikanickさんへのお願いです。

  • 先ほど、非フォーカス時のsleep値を変更できるように修正したソースをコミットしました。
  • 全体/CDTXMania.cs の1179行目のところで固定的に1msという値を設定しています。これを変更することで、sleep値を変更できます。
  • つまり、この実装は、Config.iniからsleep値を取ってくるようにはできていません。
  • そこでikanickさんに Config.iniにsleep値を読み書きする実装を追加していただきたいのです。(私は今別のことをやっていて手が回らないので・・・)
  • Config.iniへの読み書きの追加のやり方は、rev4での 全体/CConfigIni.cs で私がやった ウインドウリサイズ周りのConfig.iniの読み書きの実装追加の方法がそのまま参考になるはずです。

というわけで、いきなり無茶振りしますけれど、お願いできませんか?もちろん分からないことがあれば聞いてもらえればそれなりにお答えしますので。

2010-11-04 00:07 更新者: from
コメント

了解です。それでは ikanickさんに実装していただくことにしましょうw

影のプロマネ乙w


もちろん分からないことがあれば聞いてもらえればそれなりにお答えしますので。

ので。


追記として、「sleep(1)」と「sleep(0)」と「sleepなし」では、マシンによっては FPS が大きく異なる可能性がありますので注意して下さい。

  • sleep(1) は、だいたい 3~4ms 程度ウェイトします。
  • sleep(0) は、その場で半強制的にスレッドを切り替えるので、Windows で実行されているプロセス数やスレッド数によってウェイトが変わります。
  • sleep なしは、スレッドを切り替えないので最速です。


また、Config.ini で VSyncWait が ON の場合は、フォーカスなしの時でも sleep は使わないで下さい。

VSync と sleep の両方を適用すると悲惨なことになります。

昔の SlimDX の SampleFramework の初期状態がまさにソレで、SlimDX wiki を書くにあたっては苦労しました。(汗

2010-11-04 00:30 更新者: yyagi
コメント

また、Config.ini で VSyncWait が ON の場合は、フォーカスなしの時でも sleep は使わないで下さい。

マテ(_ _;;;; そんな風には今の GraphicsDeviceManager.cs は書かれてませんでしたよ・・・

それでは、こんな感じにすればよろしいでしょうかね?

FDK のフレームワークの Rendering の GraphicsDeviceManager.cs の game_FrameStart()内で

  1. //従来:
  2. if (!game.IsActive || deviceLost)
  3. Thread.Sleep(50);
  4. //さっき私が変えた後
  5. if (deviceLost)
  6. Thread.Sleep(50);
  7. else if (!game.IsActive)
  8. Thread.Sleep(this.game.InactiveSleepTime.Milliseconds);
  9. //それを、VSyncを踏まえてこう変えるべし
  10. if (deviceLost)
  11. Thread.Sleep(50);
  12. else if (!game.IsActive && !this.CurrentSettings.EnableVSync)
  13. Thread.Sleep(this.game.InactiveSleepTime.Milliseconds);

なお、sleepなしかsleep(0)かについてですが、動画のキャプチャ用途だと考えればsleep(0)の方がいいかなと思います。 なので、Config.iniでは、(1からではなくて) 0から50くらいまでの値を設定できるようにすればよいかなと。

2010-11-04 01:12 更新者: from
コメント

また、Config.ini で VSyncWait が ON の場合は、フォーカスなしの時でも sleep は使わないで下さい。

マテ(_ _;;;; そんな風には今の GraphicsDeviceManager.cs は書かれてませんでしたよ・・・


ええ、そうです。

この SlimDX SDK 標準付属の SampleFramework では、「フォーカスが無いときはVSyncの設定に関わらず常にsleep」なので、そんなことは一切考慮されていないのですよー。

だから、フォーカスなしの挙動を新しく追加する際には、VSyncWait たんのことも思い出してやって欲しかったのです。

VSyncWait ON でフォーカス時は滑らかな 60fps であっても、フォーカスが切れたとたん sleep と VSync が競合すると、動作がガックガクになるんですよ? しかもその競合が SampleFramework アプリのフォーカス保有時デフォルトの挙動だったりするのですよ? 何ふざけたことしてくれてますか SlimDX Group。

具体的な改善は、やぎさんが示して下さった形で OK だと思います。


なお、sleepなしかsleep(0)かについてですが、動画のキャプチャ用途だと考えればsleep(0)の方がいいかなと思います。なので、Config.iniでは、(1からではなくて) 0から50くらいまでの値を設定できるようにすればよいかなと。


何だろう、このデジャヴな感じ………

はるーか昔、このテの議論と実装の変更と混乱したリリースを2回ほど繰り返した記憶が……


余談:

あーもうこのWiki文法の CamelCase リンク機能うぜーぃ。エスケープめんどくせーぃ。他はいいからこれだけ切らせろー。

2010-11-04 02:04 更新者: yyagi
コメント

・・・。ひどい話ですね・・・>SampleFrameworkにおけるsleepとVsyncの競合

忘れないうちに、GraphicsDeviceManger.cs の修正をコミットしておきました。

2010-11-04 08:13 更新者: from
コメント

取得したはずの SlimDX wiki 過去記事のバックアップはどこ行ったんだろー?

……と思ったら、さくらのサーバ上に名前を変えて置きっぱなしでした。(汗


なので、以下のURLから閲覧可能です。

http://mainori-se.sakura.ne.jp/slimdxwiki/@old/wiki.cgi


あまり詳しくは書いてないのですが、DTXMania で使用しているバージョンの SampleFramework の説明を載せています。

ご参考になれば幸いです。

2010-11-04 10:04 更新者: ikanick
コメント

了解です。それでは ikanickさんに実装していただくことにしましょうw

えっ

もちろん分からないことがあれば聞いてもらえればそれなりにお答えしますので。

ので。

あっはいありがとうございます。えっ

コミットもやったことないので、勉強になると思ってやらせていただきます! 1からなんて到底無理ですから、やぎ。さんの支援すごく助かりますm(_ _)m なにか変な挙動したらフォローお願いします^^;

2010-11-04 10:56 更新者: ikanick
コメント

今試しに2回ほど;コミットしてみました。

Config.ini に BackSleep(0-50) パラメータを追加し、CDTXMania.csでの指定をしました。

BackSleep他で範囲外の指定をするとデフォルト値(現時点で1)に戻されるのは仕様っぽいですね。

というわけで勝手ながら新しくFDKの共通→C変換に

n値を文字列から取得して範囲内にちゃんと丸めて返す

関数を追加しました。(笑)

自分の中でできることしかやってないので、何かあれば指摘お願いいたします。

2010-11-05 02:23 更新者: yyagi
コメント

先ほどソリューションをアップデートして動作確認いたしました。

バッチリです! ikanickさんありがとうございました。支援なんていらなかったじゃないですか~。今後もよろしくお願いします!

ただ、コミット時のログにはチケット番号を入れてもらえると、もっと良かったです。
(私も一発目に同じことをやらかしたので人のことは言えないのですが・・・)

それと、対応完了したと言うことで、チケットの「解決法」を「修正済み」にして。「操作」を「完了にする」よう、お願いします>ikanickさん
これで新機能の追加が完了です。おつかれさまでした。

2010-11-05 09:00 更新者: ikanick
  • チケット完了時刻2010-11-05 09:00 に更新されました
  • 状況オープン から 完了 に更新されました
  • 解決法なし から 修正済み に更新されました
コメント

先ほどソリューションをアップデートして動作確認いたしました。 バッチリです! ikanickさんありがとうございました。支援なんていらなかったじゃないですか~。今後もよろしくお願いします!

いえいえ完全にやぎ。さんの支援のお力でした。w ありがとうございます、是非また何かお力になれればと思います!

ただ、コミット時のログにはチケット番号を入れてもらえると、もっと良かったです。

おぉ、うっかりでした。指摘ありがとうございます、次回から確認してコミットします。

あとは・・・こうかな?w お疲れ様でした!

2011-04-03 04:36 更新者: yyagi
  • コンポーネント(未割り当て) から DTXMania に更新されました
  • チケットの種類機能リクエスト から 仕様変更リクエスト に更新されました

添付ファイルリスト

添付ファイルはありません

編集

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする