Macroquad
Macroquad는 Rust로 2차원 게임과 간단한 3차원 그래픽스 프로그램을 개발하기 위한 공개 게임 엔진 프레임워크다. miniquad라는 경량 플랫폼 라이브러리를 토대로 창·그래픽스 장치·입력 이벤트를 처리하며, 사용자가 Rust 코드에서 게임 루프와 그리기 명령을 간단하게 작성하...
| 분류 | 게임 엔진, 경량 Rust 게임 프레임워크 |
|---|---|
| 개발 주체 | not-fl3 및 오픈 소스 공동체 |
| 구현 언어 | Rust |
| 기반 플랫폼 | miniquad |
| 게임 진입점 | #[macroquad::main], 비동기 메인 함수 |
| 실행 환경 | Windows, Linux, macOS, HTML5, Android, iOS |
| 그래픽스 | GPU 가속 2D, 기본 3D 그리기 |
| 주요 기능 | 텍스처, 입력, 도형·텍스트, 오디오, UI |
| 도구 | Cargo 패키지·예제, 템플릿 |
| UI | 즉시 모드 GUI |
| 별도 확장 | particles, tiled, platformer, profiler |
| 설계 기조 | 작은 의존성·간단한 빌드·이식성 |
| 라이선스 | MIT 또는 Apache License 2.0 |
| 소스 | not-fl3/macroquad |
| 문서 | docs.rs/macroquad |
Macroquad는 Rust로 2차원 게임과 간단한 3차원 그래픽스 프로그램을 개발하기 위한 공개 게임 엔진 프레임워크다. miniquad라는 경량 플랫폼 라이브러리를 토대로 창·그래픽스 장치·입력 이벤트를 처리하며, 사용자가 Rust 코드에서 게임 루프와 그리기 명령을 간단하게 작성하도록 한다. 자체 통합 레벨 편집기보다 코드 중심 작업을 우선하고 웹과 모바일·데스크톱을 같은 소스에서 지원하는 데 중점을 둔다.[1]
대표적인 프로그램은 #[macroquad::main]으로 표시된 비동기 main 함수를 사용한다. 반복문 안에서 게임 상태를 갱신하고 화면에 도형과 이미지를 출력한 뒤 next_frame().await로 다음 프레임까지 제어를 반환한다. 이러한 방식은 일반적인 네이티브 게임 루프의 형태를 유지하면서도 브라우저 WebAssembly 실행 환경에서 무한 루프가 브라우저 이벤트 처리 자체를 막지 않도록 한다. 별도의 대형 비동기 런타임을 반드시 요구하지 않는 설계다.[2]
그래픽스 API는 색상과 도형·텍스처, 2차원 카메라와 3차원 기본 메시, 텍스트 표시 등을 간단한 함수로 노출한다. 내부에서는 여러 2D 도형의 렌더링 작업을 배치 처리하여 GPU 호출 비용을 줄인다. 카메라와 출력 타깃, 셰이더·머티리얼을 조정해 더 복잡한 시각 효과를 추가할 수도 있다. 그러나 게임 세계의 상위 객체 모델과 복잡한 편집 파이프라인은 개발자가 선택해 구성한다.
입력은 키보드·마우스·게임패드와 모바일 터치 등 플랫폼별 기능으로 처리하며, 오디오 기능과 즉시 모드 GUI도 제공한다. 프로젝트 안에는 입자 효과, 타일맵, 간단한 플랫폼 게임 물리와 프로파일링 등의 예제 또는 선택적 보조 패키지가 존재한다. 이 하위 도구들이 모든 사용 사례에서 자동으로 실행되는 필수 엔진 코어에 속하는 것은 아니므로 필요할 때 의존성을 추가해 구성할 수 있다.
Cargo에 macroquad 의존성을 추가하면 Windows·Linux·macOS에서 일반적인 Rust 빌드 환경으로 실행할 수 있다. HTML5는 WebAssembly 빌드를 사용하며 모바일 환경은 플랫폼별 SDK와 패키징 구성을 필요로 한다. 프로젝트는 가능한 한 플랫폼별 조건부 코드를 줄이는 것을 목표로 하지만 WebAssembly의 파일 접근과 오디오·입력 제한처럼 실행 환경이 제공하는 기능은 다르다.
Macroquad는 MIT 또는 Apache License 2.0을 선택할 수 있는 이중 라이선스로 배포된다. 외부 애셋과 보조 라이브러리는 별도의 권리를 따르며 프로젝트 저장소는 예제와 소스, 실제 플랫폼 이식을 위한 구성 자료를 제공한다. 이러한 설계는 JavaScript 브라우저 엔진과 다른 Rust의 정적 컴파일 방식으로도 작은 게임 개발 API를 구성할 수 있음을 보여준다.[3]