Learn · concepts

Что такое ImGui? Объяснение Dear ImGui

ImGui (Dear ImGui) — это библиотека GUI для C++ с немедленным режимом отрисовки. Она отрисовывает меню каждый кадр без сохранения дерева виджетов, что часто встречается в игровых инструментах и нативных клиентах.

TRtrolPublished 4 min read

Что такое ImGui?

ImGui, сокращение от Dear ImGui, — это небольшая библиотека GUI для C++, работающая по принципу немедленного режима. Она отрисовывает меню заново каждый кадр, используя простые вызовы функций вместо хранения дерева объектов виджетов. Это позволяет быстро настроить и легко добавить поверх существующего рендерингового цикла игры, что и объясняет, почему инструменты и нативные клиенты используют её для создания быстрых наложений.

Ключевая идея — «немедленный режим»: вместо создания объекта кнопки вы вызываете функцию, которая говорит «нарисовать кнопку здесь», и этот вызов одновременно рисует кнопку и сообщает, была ли она нажата в этом кадре.

Что означает немедленный режим

ImGui перестраивает интерфейс каждый кадр. Вы не создаёте объект кнопки и не храните его. Вы вызываете функцию, которая говорит «нарисовать кнопку здесь», и этот вызов одновременно рисует кнопку и сообщает, была ли она нажата в этом кадре.

Инструментарий с удержанием состояния (retained-mode toolkit) работает наоборот. Он хранит в памяти долгоживущее дерево виджетов, и вы обновляете это дерево при изменении состояния. Немедленный режим жертвует этой постоянной структурой ради кода, который читается сверху вниз и находится рядом с вашим собственным состоянием.

  1. Приложение выполняет цикл отрисовки

    Игра отрисовывает кадр и вызывает код пользовательского интерфейса как часть этого процесса.

  2. Код пользовательского интерфейса выполняется

    Вы вызываете функции ImGui для построения меню сверху вниз: кнопки, слайдеры, флажки.

  3. ImGui отрисовывает и реагирует

    Функции отрисовывают виджеты и возвращают, взаимодействовали ли с ними в этом кадре.

  4. Ваш код реагирует

    Вы читаете возвращаемые значения и обновляете собственное состояние, например, вызываете do_thing(), когда кнопка была нажата в этом кадре.

Почему инструменты и клиенты выбирают его

ImGui популярен для меню, которые накладываются на 3D-сцену. Причины практичны:

  • Низкая задержка: оно подключается к кадру, который уже отрисовывает программа, поэтому меню реагирует немедленно.
  • Минимум интеграции: окно и несколько элементов управления — это всего лишь несколько вызовов функций. Нет файлов разметки и отдельного потока пользовательского интерфейса для управления.
  • Автономность: библиотека имеет мало зависимостей и легко интегрируется в распространенные графические бэкенды, поэтому она не тащит за собой тяжелый фреймворк.
  • Удобство отладки: те же вызовы, которые создают меню для релиза, также создают временные панели отладки, которые разработчики используют при создании функции.

Immediate-mode против retained-mode

АспектImmediate-mode (ImGui)Retained-mode toolkit
Владение состояниемВаш код хранит данныеToolkit хранит дерево виджетов
Работа на каждый кадрПерестраивайте пользовательский интерфейс каждый кадрОбновляйте дерево при изменении
Стоимость настройкиНесколько вызовов функцийБольшая структура в начале
Наилучшее соответствиеНаложения, инструменты, игровые менюБольшие приложения в стиле документов

Immediate-mode идеально подходит для чего-то, что нужно обновлять каждый кадр и реагировать на ввод мгновенно. Retained-mode лучше подходит для чего-то, что в основном статично и редко меняется.

Как это вписывается в нативный клиент

Нативное клиентское приложение, написанное на C++, часто отрисовывает своё меню с помощью ImGui поверх кадра игры. Код меню выполняется внутри цикла отрисовки, считывает собственные настройки клиента и записывает изменения напрямую обратно. Отдельного процесса пользовательского интерфейса нет, поэтому переключение функции сводится к одному вызову функции, воздействующему на значение, которым клиент уже владеет.

Это шаблон, характерный для C++. Мод Fabric, написанный на Java, достигает своего интерфейса через собственные хуки GUI игры, поэтому ImGui в основном встречается в клиентах, распространяемых в виде нативного кода, а не Java-модов.

Часто задаваемые вопросы