ウインドウ非フォーカス時のFPS向上
しまった、匿名で発行してしまった・・・
それはさておき、こいつの改善対応ができたのですが、需要ありますか?
昔々にこういうリクエストがあったように記憶しているのですが、実際のところ需要があるかどうか、ご意見いただけますと幸いです。
非フォーカス時に FPS が落ちるのは、単に SlimDX のサンプルアプリを真似てわざと実装されたものなので(sleepしてる)、Config.ini に sleep 値を指定するだけの簡単な実装ですむかと思います。
最近の高性能な PC では、非アクティブの状態で CPU や GPU をガンガン使われても、特に問題ないでしょう。 というか、むしろ、動画キャプチャの関係で、非フォーカス時にもスムーズに動いたほうが都合のいい方もいらっしゃると推測します。 昔のバージョンではウィンドウの移動中などでもお構いなくスムーズに動いていたりしたのですが、まぁそこまでは求められないでしょう。
なので、数値可変での実装には賛成です。 (だったら自分で実装しろという至極真っ当なご意見はひとまず置いておいて(汗))
需要あります、実装に賛成です。fromさんの仰る数値可変での実装はかなり便利だと思います。 スペックに応じると思うので。思うので。
>(だったら自分で実装しろという至極真っ当なご意見はひとまず置いておいて(汗)) 同上ですo
了解です。それでは ikanickさんに実装していただくことにしましょうw
以下、ikanickさんへのお願いです。
というわけで、いきなり無茶振りしますけれど、お願いできませんか?もちろん分からないことがあれば聞いてもらえればそれなりにお答えしますので。
了解です。それでは ikanickさんに実装していただくことにしましょうw
影のプロマネ乙w
もちろん分からないことがあれば聞いてもらえればそれなりにお答えしますので。
ので。
追記として、「sleep(1)」と「sleep(0)」と「sleepなし」では、マシンによっては FPS が大きく異なる可能性がありますので注意して下さい。
また、Config.ini で VSyncWait が ON の場合は、フォーカスなしの時でも sleep は使わないで下さい。
VSync と sleep の両方を適用すると悲惨なことになります。
昔の SlimDX の SampleFramework の初期状態がまさにソレで、SlimDX wiki を書くにあたっては苦労しました。(汗
また、Config.ini で VSyncWait が ON の場合は、フォーカスなしの時でも sleep は使わないで下さい。
マテ(_ _;;;; そんな風には今の GraphicsDeviceManager.cs は書かれてませんでしたよ・・・
それでは、こんな感じにすればよろしいでしょうかね?
FDK のフレームワークの Rendering の GraphicsDeviceManager.cs の game_FrameStart()内で
- //従来:
- if (!game.IsActive || deviceLost)
- Thread.Sleep(50);
- //さっき私が変えた後
- if (deviceLost)
- Thread.Sleep(50);
- else if (!game.IsActive)
- Thread.Sleep(this.game.InactiveSleepTime.Milliseconds);
- //それを、VSyncを踏まえてこう変えるべし
- if (deviceLost)
- Thread.Sleep(50);
- else if (!game.IsActive && !this.CurrentSettings.EnableVSync)
- Thread.Sleep(this.game.InactiveSleepTime.Milliseconds);
なお、sleepなしかsleep(0)かについてですが、動画のキャプチャ用途だと考えればsleep(0)の方がいいかなと思います。 なので、Config.iniでは、(1からではなくて) 0から50くらいまでの値を設定できるようにすればよいかなと。
また、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 リンク機能うぜーぃ。エスケープめんどくせーぃ。他はいいからこれだけ切らせろー。
・・・。ひどい話ですね・・・>SampleFrameworkにおけるsleepとVsyncの競合
忘れないうちに、GraphicsDeviceManger.cs の修正をコミットしておきました。
取得したはずの SlimDX wiki 過去記事のバックアップはどこ行ったんだろー?
……と思ったら、さくらのサーバ上に名前を変えて置きっぱなしでした。(汗
なので、以下のURLから閲覧可能です。
http://mainori-se.sakura.ne.jp/slimdxwiki/@old/wiki.cgi
あまり詳しくは書いてないのですが、DTXMania で使用しているバージョンの SampleFramework の説明を載せています。
ご参考になれば幸いです。
了解です。それでは ikanickさんに実装していただくことにしましょうw
えっ
もちろん分からないことがあれば聞いてもらえればそれなりにお答えしますので。
ので。
あっはいありがとうございます。えっ
コミットもやったことないので、勉強になると思ってやらせていただきます! 1からなんて到底無理ですから、やぎ。さんの支援すごく助かりますm(_ _)m なにか変な挙動したらフォローお願いします^^;
今試しに2回ほど;コミットしてみました。
Config.ini に BackSleep(0-50) パラメータを追加し、CDTXMania.csでの指定をしました。
BackSleep他で範囲外の指定をするとデフォルト値(現時点で1)に戻されるのは仕様っぽいですね。
というわけで勝手ながら新しくFDKの共通→C変換に
n値を文字列から取得して範囲内にちゃんと丸めて返す
関数を追加しました。(笑)
自分の中でできることしかやってないので、何かあれば指摘お願いいたします。
先ほどソリューションをアップデートして動作確認いたしました。
バッチリです! ikanickさんありがとうございました。支援なんていらなかったじゃないですか~。今後もよろしくお願いします!
ただ、コミット時のログにはチケット番号を入れてもらえると、もっと良かったです。
(私も一発目に同じことをやらかしたので人のことは言えないのですが・・・)
それと、対応完了したと言うことで、チケットの「解決法」を「修正済み」にして。「操作」を「完了にする」よう、お願いします>ikanickさん
これで新機能の追加が完了です。おつかれさまでした。
先ほどソリューションをアップデートして動作確認いたしました。 バッチリです! ikanickさんありがとうございました。支援なんていらなかったじゃないですか~。今後もよろしくお願いします!
いえいえ完全にやぎ。さんの支援のお力でした。w ありがとうございます、是非また何かお力になれればと思います!
ただ、コミット時のログにはチケット番号を入れてもらえると、もっと良かったです。
おぉ、うっかりでした。指摘ありがとうございます、次回から確認してコミットします。
あとは・・・こうかな?w お疲れ様でした!
非フォーカス時FPSががくっと落ちるのを改善して欲しい。