Learn · concepts
Что такое ImGui? Объяснение Dear ImGui
ImGui (Dear ImGui) — это библиотека GUI для C++ с немедленным режимом отрисовки. Она отрисовывает меню каждый кадр без сохранения дерева виджетов, что часто встречается в игровых инструментах и нативных клиентах.
Что такое ImGui?
ImGui, сокращение от Dear ImGui, — это небольшая библиотека GUI для C++, работающая по принципу немедленного режима. Она отрисовывает меню заново каждый кадр, используя простые вызовы функций вместо хранения дерева объектов виджетов. Это позволяет быстро настроить и легко добавить поверх существующего рендерингового цикла игры, что и объясняет, почему инструменты и нативные клиенты используют её для создания быстрых наложений.
Ключевая идея — «немедленный режим»: вместо создания объекта кнопки вы вызываете функцию, которая говорит «нарисовать кнопку здесь», и этот вызов одновременно рисует кнопку и сообщает, была ли она нажата в этом кадре.
Что означает немедленный режим
ImGui перестраивает интерфейс каждый кадр. Вы не создаёте объект кнопки и не храните его. Вы вызываете функцию, которая говорит «нарисовать кнопку здесь», и этот вызов одновременно рисует кнопку и сообщает, была ли она нажата в этом кадре.
Инструментарий с удержанием состояния (retained-mode toolkit) работает наоборот. Он хранит в памяти долгоживущее дерево виджетов, и вы обновляете это дерево при изменении состояния. Немедленный режим жертвует этой постоянной структурой ради кода, который читается сверху вниз и находится рядом с вашим собственным состоянием.
Приложение выполняет цикл отрисовки
Игра отрисовывает кадр и вызывает код пользовательского интерфейса как часть этого процесса.
Код пользовательского интерфейса выполняется
Вы вызываете функции ImGui для построения меню сверху вниз: кнопки, слайдеры, флажки.
ImGui отрисовывает и реагирует
Функции отрисовывают виджеты и возвращают, взаимодействовали ли с ними в этом кадре.
Ваш код реагирует
Вы читаете возвращаемые значения и обновляете собственное состояние, например, вызываете
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-модов.
Часто задаваемые вопросы
Основная библиотека написана на C++, и именно в C++ чаще всего её используют. Для других языков существуют сторонние привязки, но оригинальное и наиболее распространённое применение — это инструменты для разработки игр на C++.
Из коробки у него простой вид инструмента разработчика. Проекты, которым нужен собственный стиль оформления, используют его в значительной степени или рисуют свои собственные виджеты поверх.
Необычным образом. Мод Fabric работает в Java и использует систему графического интерфейса игры. Нативный клиент на C++ — это типичное место для ImGui.
Нет. Переделка пользовательского интерфейса недорога, и программа уже отрисовывает каждый кадр, поэтому меню отрисовывается вместе с работой, которая и так выполняется.