MicroUI — полноценная GUI-библиотека в ~1100 строках C, которая сама ничего не рисует

MicroUI от rxi умещает immediate-mode UI-тулкит — окна, ползунки, прокручиваемые панели, текст с переносом по словам — примерно в 1100 строк ANSI C без единой аллокации в куче. Секрет компактности: она вообще не трогает экран. Рендеринг подключаете вы.

Вкратце

MicroUI выдаёт список команд рисования и требует ввод обратно; сама не рисует и не аллоцирует ничего сверх фиксированной области памяти. Так она остаётся достаточно портируемой, чтобы компилироваться в WebAssembly и работать в браузере.

Один давний пользователь назвал её своим выбором для игрушечных проектов, но пометил как фактически заброшенную, с известным багом в команде рисования — невыровненным доступом по указателю, безобидным, пока не запустишь под Zig, который ровно на этом паникует.

Целый UI-тулкит, который отказывается что-либо рисовать

Immediate-mode UI-библиотека MicroUI от rxi
Immediate-mode UI-библиотека MicroUI от rxi

MicroUI от rxi — immediate-mode UI-библиотека, написанная примерно в 1100 строк ANSI C и выпущенная под лицензией MIT. Список функций неправдоподобно полон для такого размера: окна, прокручиваемые панели, кнопки, ползунки, текстовые поля, метки, чекбоксы и текст с переносом по словам, плюс простая система раскладки и хуки для добавления своих контролов.

Она остаётся маленькой за счёт того, что намеренно опускает. MicroUI не делает рисования. Она «ожидает, что пользователь предоставит ввод и обработает получившиеся команды рисования» — вы вызываете UI-функции каждый кадр, она отдаёт список прямоугольников и текста на отрисовку, а вы рисуете их тем, что есть. Она также ничего не аллоцирует: вся библиотека работает внутри области памяти фиксированного размера, без динамической аллокации. Immediate-mode плюс свой рендерер плюс никакого malloc — вот и весь фокус, и именно он делает библиотеку достаточно портируемой, чтобы вставить почти куда угодно.

Скриншот демо MicroUI
Скриншот демо MicroUI

Минимализм настоящий — измеренный в сжатых килобайтах

Самый авторитетный голос в треде пришёл от автора заголовочников sokol, который подключил MicroUI к собственному стеку и взвесил результат против альтернатив:

«Я написал небольшое демо, чтобы запустить microui поверх заголовков sokol… по-настоящему интересно, насколько она минимальна… сэмпл microui: 79,6 КБ сжатой загрузки. Сэмпл Nuklear: 155 КБ сжатой». — floooh, автор библиотек sokol

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

Сноска: она тихо заброшена, с реальным багом

Самое острое практическое предупреждение пришло от того, кто выпускал её годами:

«Это уже какое-то время мой выбор для личных игрушечных проектов… Упомяну, впрочем, что на этот момент она вроде как заброшена. Есть баг в итераторе команд рисования, который делает невыровненный доступ по указателю, и если ваше окружение настроено это ловить, это раздражает (Zig, например, на этом паникует)… все форки, что я пробовал, были тонко неверны». — разработчик, использовавший её во многих проектах

Пробелы, которые люди прощупывают, постоянны: рендеринг текста (свой атлас глифов приносите?) и недостающая склейка с оконной системой. «Сложная часть, похоже, отсутствует: стыковка с реальной оконной системой — X11, TUI, WIN32», — написал комментатор, желавший включённого платформенного слоя. И рефлекторный фильтр для любой UI-библиотеки тоже появился: «Первое, что я ищу в любой UI-библиотеке, — поддержку доступности. Тривиально отсеивает игрушечные проекты», — отметил разработчик, использующий a11y как тест на зрелость.

Крошечная за счёт жёсткой черты вокруг своей задачи

MicroUI мала, потому что ответила на вопрос «что обязана делать UI-библиотека?» самым узким возможным ответом: отслеживать состояние виджетов, считать раскладку, выдавать команды рисования. Всё остальное — пиксели, шрифты, окно, доступность — ваша забота. Это плюс для встраивания в дебаг-меню Raylib или одноразовый кросс-платформенный инструмент и стена, если хотелось тулкит «всё в комплекте». Она также, по собственному признанию самых верных пользователей, активно не сопровождается — так что правильный способ её взять — это файл на 1100 строк, который вы готовы держать сами, с багом и всем прочим.

Получайте такие разборы каждый день

Главные истории Hacker News — на email, в Telegram или RSS.

Следующая новость · 23 из 24 Читать дальше
🌍Other

Почему в жилой дом в Уолнат-Крик не помещается ни одной трёхкомнатной квартиры

Кевин Бёрк кладёт проект калифорнийского дома рядом с копенгагенским кварталом с внутренним двором и спрашивает, почему нормы гарантируют тёмные квартиры с окнами на одну сторону. Верхний комментарий в треде на HN — про машины.

★ 51 · 💬 75 · kevin.burke.dev · 5 мин