Zig 언어를 위한 GPU 가속 UI 프레임워크 Gooey

시스템 프로그래밍 언어로 UI를 구현할 때 적절한 프레임워크를 찾지 못해 개발 환경 구축에 어려움을 겪는 경우가 많다. Gooey(구이)는 Zig(지그) 언어를 위해 설계된 GPU 가속 UI 프레임워크다. macOS의 Metal(메탈), Linux의 Vulkan(벌컨) 및 Wayland(웨이랜드), 브라우저의 WASM(웹어셈블리)과 WebGPU(웹-지피유)를 타겟으로 작동한다. 하드웨어 가속을 통해 UI 렌더링 효율을 높이는 구조를 취하고 있으며, 현재는 API가 진화하고 있는 초기 개발 단계에 있다.

대규모 데이터셋의 효율적인 렌더링을 위해 가상화 리스트와 테이블 컴포넌트를 제공한다. VirtualizedList는 고정 높이와 가변 높이를 모두 지원하며, 전체 항목 수에 상관없이 현재 화면에 보이는 요소만 렌더링한다. 데이터 총량과 관계없이 가시 영역의 요소만 처리함으로써 렌더링 부하를 줄이고 메모리 효율을 높였다.

2D Table은 가로와 세로 방향의 가상화를 동시에 지원한다. 사용자는 테이블 내에서 컬럼 리사이징, 데이터 정렬, 항목 선택 기능을 통해 대량의 정보를 관리할 수 있다.

UI 스레드 외부에서 비동기 작업을 처리한다

개발자가 네트워크 요청이나 파일 입출력, 고부하 연산 같은 작업을 실행할 때 UI 스레드가 점유되면 화면 멈춤 현상이 발생한다. Gooey는 Zig 0.16의 `std.Io`를 활용해 이러한 비동기 작업을 UI 스레드 외부로 분리한다. 구체적으로 `cx.io().async(...)`를 통해 백그라운드 작업을 생성하고, 그 결과값을 `std.Io.Queue(T)`라는 유한 큐에 담아 전달한다. 렌더 루프는 매 프레임마다 이 큐를 확인하고 비우며 UI 상태를 업데이트한다. 백그라운드 작업이 UI 상태를 직접 수정하지 않고 타입이 지정된 결과만 푸시하므로, 멀티스레드 환경의 상태 락(lock) 경쟁 문제를 제거했다.

데이터 전달 과정의 메모리 할당 비용을 최소화하기 위해 핸들러 인자에는 8바이트 제한을 두었다. `updateWith`, `commandWith`, `deferWith`와 같은 변형 함수들이 이 역할을 수행하며, 전달되는 인자는 내부적으로 `u64` 타입으로 패킹되어 저장된다. 8바이트를 초과하는 데이터를 인자로 넘기려 하면 컴파일 에러가 발생해 빌드 단계에서 차단된다. 이는 런타임 시점의 동적 할당을 배제하는 제로 할당(zero-allocation) 전략으로 런타임 오버헤드를 최소화하려는 설계다.

외부 실행기(executor)를 별도로 소유하지 않고 Zig 표준 라이브러리의 기능을 그대로 활용해 비동기 제어를 수행함으로써 실행 효율을 높였다.

외부 Zig 패키지 의존성이 없는 구조를 가진다

패키지 의존성이 늘어날수록 빌드 시간은 길어지고 버전 충돌 위험은 커진다. Gooey는 `build.zig.zon`(Zig 패키지 관리 파일)에 나열된 외부 의존성을 완전히 제거했다. 외부 패키지를 거치지 않고 오직 플랫폼 시스템 프레임워크와 라이브러리에만 링크되어 동작하는 구조를 택해, 외부 라이브러리 업데이트에 따른 호환성 문제나 빌드 파이프라인의 복잡성을 차단했다. 시스템 자원에 직접 접근해 GPU 가속 UI를 구현함으로써 런타임 오버헤드를 줄였다.

UI 디자인의 일관성은 시맨틱 역할 기반의 테마 시스템으로 관리한다. Catppuccin Latte(라이트 테마)와 Catppuccin Macchiato(다크 테마)를 내장하여 컴포넌트마다 색상을 개별적으로 지정하는 과정을 생략했다. 모든 필드에 시맨틱 역할이 부여되어 있어 컴포넌트가 스스로 적절한 색상을 찾아 적용하며, 테마 변경 시 전체 UI의 색상 체계를 즉각적으로 전환할 수 있다.

텍스트 스케일링은 단일 소스 기반의 제어 방식을 따른다. `font_size_base` 필드 하나로 모든 컴포넌트의 텍스트 크기를 일관되게 조절하며, 기본값은 14로 설정되어 있다. 개별 컴포넌트의 폰트 크기를 수정하지 않고도 전체 인터페이스의 가독성과 스케일을 한 번에 제어할 수 있다.

Zig 개발 환경에서 적절한 UI 프레임워크의 부재는 시스템 프로그래밍의 효율을 저해하는 요소였다. Gooey는 외부 패키지 의존성 없이 플랫폼 시스템 라이브러리로 GPU 가속을 구현하며, Zig 0.16 std.Io의 Io.Queue 패턴을 통해 비동기 작업과 상태 업데이트를 처리한다.

이는 고성능 데스크톱 및 웹 앱 UI 구현을 위한 실질적인 기술적 대안이 된다. 의존성 제거와 제로 할당 전략의 결합이 프레임워크의 전반적인 실행 성능을 높인다.