MicroUI: ANSI C로 작성된 미니멀리스트 즉시 모드 UI 라이브러리

개요

MicroUI는 ANSI C로 작성된 작고 이식성이 뛰어난 즉시 모드(immediate-mode) UI 라이브러리입니다. 대형 프레임워크의 오버헤드 없이 최소한의 그래픽 인터페이스가 필요한 개발자를 위해 설계되었습니다. 이 라이브러리는 약 1,100줄의 소스 코드(SLOC)로 구성된 극도의 미니멀리즘과, 추가적인 메모리 할당 없이 고정된 크기의 메모리 영역 내에서 작동할 수 있는 능력이 특징입니다.

핵심 기능 및 기술 사양

MicroUI는 최대의 이식성을 위해 ANSI C를 엄격히 준수하면서 일련의 내장 컨트롤과 유연한 레이아웃 시스템을 제공합니다.

내장 UI 컨트롤

MicroUI는 다음과 같은 표준 인터페이스 요소를 포함합니다:

  • Windows
  • Scrollable panels
  • Buttons
  • Sliders
  • Textboxes
  • Labels
  • Checkboxes
  • Word-wrapped text

기술적 제약 사항

  • Memory Management: 라이브러리는 고정된 크기의 메모리 영역 내에서 작동하므로, 런타임 중에 추가 메모리가 할당되지 않습니다.
  • Rendering Agnostic: MicroUI는 내장된 그래픽 백엔드를 포함하지 않습니다. 사각형과 텍스트를 그릴 수 있는 모든 렌더링 시스템과 함께 작동하며, 사용자가 렌더러 백엔드 함수를 제공해야 합니다.
  • Customization: 라이브러리는 사용자가 자신만의 커스텀 컨트롤을 쉽게 구현하고 추가할 수 있도록 설계되었습니다.

성능 및 점유율 비교

다른 즉시 모드 GUI (IMGUI) 라이브러리와 비교했을 때, MicroUI는 현저히 작은 바이너리 크기를 보여줍니다. sokol headers 위에서 실행되는 데모에서 압축된 다운로드 크기는 다음과 같습니다:

  • MicroUI: 79.6 KBytes
  • Nuklear: 155 KB
  • Dear ImGui: 491 KB

이는 바이너리 크기가 중요한 제약 사항인 프로젝트에서 MicroUI를 매우 효율적인 선택으로 만들어 줍니다.

통합 및 생태계

MicroUI는 다양한 환경에 통합되었으며 다양한 기술적 개념 증명(proof-of-concept)에 사용되었습니다.

언어 및 프레임워크 지원

  • Odin: MicroUI는 Odin vendor libraries에 포함되어 있으며, Raylib에서 디버그 메뉴를 생성하는 데 자주 사용됩니다.
  • WebAssembly (WASM): 라이브러리는 WASM으로 컴파일될 수 있어, 브라우저 환경에서 UI 인터페이스를 렌더링할 수 있습니다.
  • Cross-Platform Binaries: Cosmopolitan Libc와 결합하여 Linux, Windows, BSDs와 같은 다양한 운영체제에서 작동하는 "build once, run anywhere" 그래픽 애플리케이션을 제작하는 데 사용되었습니다.

구현 요구 사항

MicroUI는 렌더링 방식에 구애받지 않으므로, 개발자는 실제 윈도우 시스템(X11, Win32 또는 TUI 등)과의 인터페이스를 처리하고 기본 프리미티브(사각형 및 텍스트)를 그리는 데 필요한 함수를 제공해야 합니다.

커뮤니티 통찰 및 한계점

미니멀리즘으로 찬사를 받지만, 커뮤니티에서는 몇 가지 트레이드오프와 기술적 난관을 언급했습니다.

알려진 문제

일부 사용자는 라이브러리가 현재 "abandonware" 상태라고 보고했으며, draw call iterator와 관련된 특정 버그가 잘못된 포인터 접근을 유발하여 정렬되지 않은 포인터 접근(misaligned pointer access)이 발생할 수 있습니다. 이는 Zig와 같이 엄격한 정렬 요구 사항을 가진 환경에서 패닉(panic)을 유할 수 있습니다.

트레이드오프

  • Accessibility: 라이브러리는 내장된 접근성 지원이 부족하며, 이는 일부 개발자들이 프로덕션급 소프트웨어의 필수 요건으로 간주합니다.
  • Complexity: 기본적인 기능만 제공하기 때문에, 더 많은 "bells and whistles"를 요구하는 개발자들은 복잡한 애플리케이션 요구 사항에 비해 라이브러리가 너무 제한적이라고 느낄 수 있습니다.
  • Comparison to Retained Mode: libagar와 같은 리텐션 모드 GUI와 달리, MicroUI는 즉시 모드 패러다임의 전형적인 특징인 UI 트리의 지속적인 상태를 유지하지 않습니다.

Sources