Learn · concepts

ImGuiとは?Dear ImGui解説

ImGui (Dear ImGui) は、C++ 用のイミディエイトモード GUI ライブラリです。ウィジェットツリーを保持せず、毎フレームメニューを描画するため、ゲームツールやネイティブクライアントでよく利用されます.

TRtrolPublished 1 min read

ImGuiとは?

ImGui(Dear ImGuiの略)は、C++向けの小型のイミディエイトモードGUIライブラリです。ウィジェットオブジェクトのツリー構造を保持する代わりに、毎フレーム、単純な関数呼び出しからメニューを新たに描画します。これにより、設定が容易で、ゲームの既存のレンダーループに簡単に組み込むことができるため、ツールやネイティブクライアントでは低遅延オーバーレイに利用されています。

重要な点は「イミディエイトモード」です。ボタンオブジェクトを作成して保存する代わりに、関数を呼び出して「ここにボタンを描画する」と指示します。この呼び出しは、ボタンを描画すると同時に、そのフレームでクリックされたかどうかを通知します。

イミディエイトモードの意味

ImGuiは、毎フレームインターフェースを再構築します。ボタンオブジェクトを作成して保存することはありません。関数を呼び出して「ここにボタンを描画する」と指示します。この呼び出しは、ボタンを描画すると同時に、そのフレームでクリックされたかどうかを通知します。

リテンションモードのツールキットは、その逆の動作をします。メモリ内に長寿命のウィジェットツリーを保持し、状態が変化したときにそのツリーを更新します。イミディエイトモードは、この永続的な構造を、自分の状態の隣に存在する、上から下へ読み込むコードと交換します.

  1. アプリケーションがフレームループを実行します

    ゲームはフレームをレンダリングし、その一部としてUIコードを呼び出します.

  2. UIコードが実行される

    ImGuiの関数を呼び出して、ボタン、スライダー、チェックボックスなど、メニューを上から下へ構築します.

  3. ImGui が描画し、応答する

    これらの関数は、ウィジェットの描画と、このフレームとのインタラクションがあったかどうかを返す機能を持ちます.

  4. あなたのコードが反応します

    戻り値を確認し、ご自身の状態を更新してください。例えば、このフレームでボタンがクリックされたときに do_thing() を呼び出すような感じです.

なぜツールやクライアントがそれを選ぶのか

ImGuiは、3Dシーンの上に配置されるメニューで人気があります。その理由は実用的です。

  • 低遅延: 既にプログラムがレンダリングしているフレームにフックするため、メニューはすぐに反応します。
  • わずかな連携: ウィンドウといくつかのコントロールは、ほんのわずかな関数呼び出しで実現できます。レイアウトファイルや、管理する別のUIスレッドは必要ありません。
  • 自己完結型: ライブラリは依存関係が少なく、一般的なグラフィックスバックエンドに適合するため、大規模なフレームワークを引き込むことはありません。
  • デバッグに優しい: リリース版のメニューを構築するのと同じ呼び出しで、開発者が機能を作成する際に使用する使い捨てのデバッグパネルも構築できます。

即時モード vs 保留モード

側面即時モード (ImGui)保留モードツールキット
状態の所有権あなたのコードがデータを保持しますツールキットがウィジェットツリーを保持します
フレームごとの作業UIを各フレームごとに再構築します変更時にツリーを更新します
セットアップコストほんのわずかな関数呼び出しより多くの構造を事前に準備します
最適な用途オーバーレイ、ツール、ゲームメニュー大規模なドキュメント形式のアプリ

即時モードは、毎フレーム更新し、即座に入力に応答する必要があるものに最適です。保留モードは、ほとんど静止しており、まれに変更されるものに適しています。

ネイティブクライアントへの適合性

C++で構築されたネイティブユーティリティクライアントは、ゲームのフレーム上にImGuiでメニューを描画することが多いです。メニューコードはレンダーループ内で実行され、クライアント自身の設定を読み込み、変更を直接書き戻します。別のUIプロセスは存在しないため、機能の切り替えはクライアントが既に所有する値に対する単一の関数呼び出しで済みます。

これはC++のパターンです。Fabric modで書かれたJavaのmodは、ゲーム自身のGUIフックを通してインターフェースに到達するため、ImGuiは主にネイティブコードとして配布されるクライアントで現れます。Java modとしてはあまり見られません.

よくある質問