- ImGui (Dear ImGui) — это небольшая библиотека GUI для C++, работающая по принципу немедленного режима.
- Она отрисовывает меню заново каждый кадр посредством вызовов функций, без необходимости поддерживать дерево виджетов.
- Нативные клиенты и инструменты выбирают её для отрисовки с низкой задержкой поверх 3D-сцены.
- Это паттерн C++; Java Fabric мод использует собственные хуки GUI игры вместо этого.
ImGui, сокращенно Dear ImGui, — это небольшая библиотека GUI для C++, работающая по принципу немедленного режима. Она отрисовывает меню заново каждый кадр, используя простые вызовы функций вместо хранения дерева объектов виджетов. Это позволяет быстро настроить интерфейс и легко интегрировать его в существующий рендеринг игры, что и объясняет, почему инструменты и нативные клиенты используют её для создания быстрых наложений.
Где используется Opal
Opal — это мод для Fabric, поэтому он строит свой интерфейс, используя собственные хуки GUI игры, а не ImGui. Если вы хотите добавить функции, не затрагивая нативный код, вам следует начать с JavaScript-движка скриптов GraalVM. Ознакомьтесь с руководством по настройке и руководством по скриптам.
Что означает immediate-mode
ImGui перестраивает интерфейс в каждом кадре. Вы не создаете объект кнопки и не храните его. Вы вызываете функцию, которая говорит "нарисуй кнопку здесь", и этот вызов как рисует кнопку, так и сообщает вам, была ли она нажата в этом кадре.
Инструментарий retained-mode работает наоборот. Он хранит в памяти долгоживущее дерево виджетов и обновляет его при изменении состояния. Immediate-mode жертвует этой постоянной структурой ради кода, который читается сверху вниз и находится рядом с вашим собственным состоянием.
Почему инструменты и клиенты выбирают его
ImGui популярен для меню, которые накладываются на 3D-сцену. Причины практичны.
- Низкая задержка: он подключается к кадру, который программа уже отрисовывает, поэтому меню реагирует немедленно.
- Мало "склейки": окно и несколько элементов управления — это всего лишь несколько вызовов функций. Нет файла макета и нет отдельного потока пользовательского интерфейса для управления.
- Самодостаточный: библиотека имеет мало зависимостей и встраивается в распространенные графические бэкенды, поэтому она не подтягивает тяжелый фреймворк.
- Удобный для отладки: те же вызовы, которые строят релизное меню, также строят одноразовые панели отладки, которые разработчики используют при создании функции.
Immediate-mode против retained-mode
| Аспект | Режим немедленной отрисовки (ImGui) | Инструментарий с удержанием состояния |
|---|---|---|
| Владение состоянием | Ваш код хранит данные | Инструментарий хранит дерево виджетов |
| Работа на кадр | Перестраивайте UI каждый кадр | Обновляйте дерево при изменении |
| Начальные затраты | Несколько вызовов функций | Большая структура в начале |
| Наилучшее соответствие | Наложения, инструменты, игровые меню | Большие приложения в стиле документов |
Как это подходит для нативного клиента
Нативный утилитарный клиент, созданный на C++, часто отрисовывает свое меню с помощью ImGui поверх кадра игры. Код меню выполняется внутри цикла отрисовки, считывает собственные настройки клиента и записывает изменения непосредственно обратно. Отдельного UI-процесса нет, поэтому переключение функции сводится к одному вызову функции для значения, которым клиент уже владеет.
Это шаблон C++. Мод Fabric, написанный на Java, обращается к своему интерфейсу через собственные GUI-хуки игры, поэтому ImGui в основном встречается в клиентах, поставляемых в виде нативного кода, а не в виде Java-модов.
FAQ
Основная библиотека написана на C++, и именно в этом языке чаще всего её используют. Существуют привязки сообщества для других языков, но оригинальное и наиболее распространенное использование — в C++ инструментах для игр и нативных приложениях.
По умолчанию он имеет вид простого инструмента разработчика. Проекты, которым требуется собственная тема оформления, либо отрисовывают собственные виджеты поверх, поэтому выпущенное меню может выглядеть совершенно не так, как по умолчанию.
Не в обычном смысле. Мод Fabric работает в Java и использует систему графического интерфейса игры. Нативная C++ клиент — это типичное место для ImGui.
Нет. Перерисовка интерфейса обходится недорого, и программа уже отрисовывает каждый кадр, поэтому меню использует работу, которая и так выполняется.