[解決済み] リテインドモードGUIと比較して、イミディエイトモードGUIを使用した場合のパフォーマンスにはどのような影響がありますか?
質問事項
現在、Windowsの標準的なデスクトップアプリケーション(標準的とは、ボタン、テキスト、スライダーなどの派手なものがないという意味です)を作っているのですが、いくつかのGUIフレームワークを調べて、そのすべてに反感を持ったため、自分でGUIフレームワークを書くことにしました。趣味のプロジェクトなので、実験もいとわず、GUIをretain-modeではなくimmediate-modeにして、コードを単純化する方法がとても気に入ったので、決めました。しかし、ここで疑問があります。
典型的なデスクトップ・アプリケーションに使用する場合、リテインド・モードGUIと比較して、イミディエイト・モードGUIを使用することのパフォーマンスへの影響はどの程度ですか?
IMGUIはフレームごとに再描画しなければならないので、パフォーマンスが悪くなるといつも聞きます(何らかの方法でキャッシュしている場合でも、フレームごとにロジックを実行する必要があります)。しかし、ここではどの程度多く話しているのでしょうか?私は2倍のCPU時間を費やしているのでしょうか?もっと?もし、私が20のIMGUIプログラムを走らせたと仮定すると、それはCPUを最大にするでしょうか(私がすでにそれを最適化したと仮定して)?私は、フレームごとに再描画する必要がない非ゲーム環境において、そのトレードオフがまだ実行可能であるかどうか、大まかなところを知りたいだけです。
もうひとつ、レイテンシーに関して、理解できないことがあります。それは の章では、IMGUIについて説明しています。 の中に ワークインプログレスブック による ヨハネス・ノルネビー は、次のように説明されています。
<ブロッククオートフレームシャーリング
IMGUIのリアルタイム性の文脈で注意すべき点の1つは、次のとおりです。 アプリケーション(常に新しいフレームを1秒間に何度もレンダリングする)において ユーザーとのインタラクションは、常に何かに対する反応であるということです。 前のフレームに描画された これは、ユーザーインターフェイスが ウィジェットがあることを認識させるために、少なくとも一度は描画されます。 との対話が必要です。ほとんどの場合、このことは フレームレートが十分高ければ問題ないのですが、注意すべき点です。 を意識しています。
リテインドモードのGUIではどう違うのでしょうか?retained-mode GUIより1フレーム多くインプットラグがあるということでしょうか?
解決方法は?
この質問にはまだ関心があるようなので(閲覧数から判断して)、更新を投稿した方がいいと思いました。
修士論文でイミディエイトモードGUIを実装することになり、パフォーマンスについていくつかの数値を確認しました。その要点は
大丈夫です。システム的な特性ではなく、実装の品質が支配的です。
他の多くの既存のリテインドモードGUIと比較すると、私のイミディエイトモード実装は一般的にかなり高速に動作しています。パラダイム間の理論的な性能差は、ほとんどのGUIが恐ろしく最適化されていないという事実によって打ち消されています。全体として、imguiは、高速に応答し、バッテリーを消耗しないGUIを作成するための完全に実行可能なアプローチです。
UI要素を50%程度にしてSpotifyクローンを作ってみましたが、1フレームのレンダリングがマイクロ秒台でした。実際、このアプリケーションでは、1フレームに使用する時間は常に400μs未満でした。60HzのモニターでV-Syncを有効にした場合、これは約3%のCPU負荷に相当します。 シングルコアで (400μs/16ms)となります。 単純な実装の場合 . さらに、この400μsの大部分は、UI要素が増えても負荷が増加しない定数要因によるものでした(たとえば、入力の受信や、UIの複雑さに比例しないGPUステートのセットアップなど)。
完璧主義者の私は、何もしないGUIがサイクルを消費していることをまだ嫌っていましたが、その反面、大きなメリットもありました。 GUIが大きく操作されたり、ウィンドウがサイズ変更されたりしても、400μsを記録していました! これは、既存の多くのリテインドモードGUIを吹き飛ばすものです。Spotify、Windows Explorer、Visual Studio、その他のデスクトップアプリケーションのサイズを変更してみて、その反応を見れば、私の言っていることが理解できるはずです。私のPCでは、リサイズするとSpotifyは2fps程度まで落ちると思います。
また、UIの変更は基本的に自由です。あるフレームに100個のボタンを表示し、次のフレームでそれらをすべてテキストボックスに置き換えても、パフォーマンスに差はありません。リテインドモードのGUIは、こうした場面で苦戦する傾向があります。
あと3つ、考えています。
-
ほとんどの時間はテキストレンダリングに費やされ、残りは無関係に近いです。もし、大幅に最適化したいのであれば、この部分に注目することになるでしょう。しかし、少しの最適化でも、まともなものにすることができます。
-
パフォーマンスの大きな違いは、リテインモードとイミディエイトモードの違いだけで説明できるのか、あるいは全く説明できないのか疑問です。例えば、SpotifyはUIにWebスタックを使用しているので、遅くなるのは当然です。
WPFやWin32などは、遅くても大丈夫だから、あるいは今使っているハードウェアとは全く違うハードウェアに最適化されているから、遅いだけなんでしょうね。もちろん、それ以上のこともできますが、その差を正当化できるほどではありません。
-
リテインドモードのGUIを作れば、私のイミディエイトモードのGUIよりずっと速くなるはずです。ただ、一般的にそのようなインセンティブはほとんどなく、正直なところ、少し悲しいです。
更新情報
何人かの方から質問がありましたので。 卒論を公開することにしました。
あなたが見るものは、一般に公開されることを意図していないものであり、一般に公開されるソフトウェアに対する私の個人的な最低品質の期待をパスしないものであることに注意してください(それが、そもそも私がこれを公開しなかった理由です)。ですから、このソフトウェアを使って実際のソフトウェアを構築するのではなく、教育的な目的でのみ使用してください。私もサポートするつもりはありません。
ダウンロードには論文本体( ドイツ語で ) 、Windows用のビルド済み実行ファイル、およびソースコード (C++)があります。
https://1drv.ms/u/s!AsdZfH5hzKtp9zy1YZtHgeSMApOp?e=FbxLUs
楽しんでください。
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】構造体のベクター初期化について
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] MVPとMVC、その違いは何ですか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] C++の識別子でアンダースコアを使用する場合のルールについて教えてください。
-
[解決済み] ベースクラスのコンストラクタを呼び出す際のルールは?
-
[解決済み] Dockerコンテナのランタイムパフォーマンスコストとは何ですか?
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
-
[解決済み】C++17の新機能は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件