私は、MFC、QT、Forms、SWING、および数年前のいくつかのWeb-GUIフレームワークなど、多くの「保持された」GUIシステム(これが意味することについては以下)でアプリケーション開発に取り組んできました。私は常に、ほとんどのGUIシステムの概念が非常に複雑で不器用であることを発見しました。コールバックイベント、リスナー、データコピー、文字列から何かへの変換の量-変換(など)は、アプリケーションの他の部分と比較して、常にミスと頭痛の原因でした。(データバインディング/モデルの「適切な」使用でも)。
今、私はコンピューターゲームを書いています:)。私はこれまでに1つのGUIで作業しました。宮城(よく知られていませんが、基本的に他のすべてのシステムと同じアイデアです。)
ひどかった。
ゲームのようなリアルタイムレンダリング環境の場合、「保持された」GUIシステムはさらに時代遅れになったように感じます。ユーザーインターフェイスは通常、自動レイアウトする必要も、オンザフライでサイズ変更可能なウィンドウを持つ必要もありません。代わりに、常に変化するデータ(世界のモデルの3D位置など)と非常に効率的に対話する必要があります
数年前、私は基本的にイミディエイトグラフィックスモードに似ていますが、ユーザーインターフェイス用の「IMGUI」に出会いました。私はまだアプリケーション開発に携わっており、IMGUIシーン自体はそれほど広くも成功もしていないように思えたので、あまり注意を向けませんでした。それでも、彼らがとるアプローチは非常にセクシーでエレガントであるため、このUIの方法を使用して次のプロジェクトのために何かを書きたいと思うようになりました(私は職場で誰も納得させることができませんでした:(...)
「保持」と「即時」の意味を要約します。
保持されたGUI:別の初期化フェーズで、ラベル、ボタン、テキストボックスなどの「GUIコントロール」を作成し、それらを画面に配置する記述的な(またはプログラム的な)方法を使用します。コントロールは、X、Yの位置、サイズ、境界線、子コントロール、ラベルテキスト、画像などの独自の状態のほとんどをメモリに保持します。コールバックとリスナーを追加して、イベントを通知したり、GUIコントロールのデータを更新したりできます。
即時GUI:GUIライブラリは、ワンショットの "RenderButton"、 "RenderLabel"、 "RenderTextBox" ...関数で構成されています(編集:Renderによって混乱しないでくださいプレフィックス。これらの関数は、ユーザー入力のポーリング、文字の挿入、ユーザーがキーを押したときに文字の繰り返し速度を処理するなどのコントロールの背後にあるロジックも実行します...)コントロールを「即座に」レンダリングするために呼び出すことができます(doesn ' tはすぐにGPUに書き込まれる必要があります。通常は、現在のフレームについて記憶され、後で適切なバッチに分類されます。ライブラリはこれらの「状態」を保持しません。ボタンを非表示にする場合は、RenderButton関数を呼び出さないでください。ボタンやチェックボックスなどのユーザーインタラクションを持つすべてのRenderXXX関数には、ユーザーがボタンをクリックしたかどうかを示す戻り値があります。あなたの「RenderGUI」関数は、ゲームの状態に応じてRenderXXX関数を呼び出すかどうかの大きなif / else関数のように見え、すべてのデータ更新ロジック(ボタンが押されたとき)がフローに絡まります。すべてのデータストレージはGUIの「外部」にあり、Render機能にオンデマンドで渡されます。(もちろん、大きな関数をいくつかに分割したり、GUIの一部をグループ化するためにいくつかのクラス抽象化を使用したりします。1980年のようなコードはもう書いていませんよね;))
今回、Unity3Dが実際に組み込みのGUIシステムとまったく同じ基本的なアプローチを使用していることがわかりました。おそらく、このアプローチを備えたGUIがいくつかありますか?
それでも..周りを見ると、保持されたGUIシステムに強いバイアスがあるように見えますか?少なくとも、Unity3Dを除き、このアプローチは見つかりませんでした。元のIMGUIコミュニティは、かなり静かなようです。
だから誰も両方のアイデアで働いていて、強い意見がありますか?
編集:私は実世界の経験から生じる意見に最も興味があります。IMGUIフォーラムでは、即時GUIアプローチの「理論上の弱点」について多くの白熱した議論があると思いますが、実際の弱点について知ることは常により啓発的であると思います。