9센트 칩으로 만든 게임 콘솔, Rust로 구현!
RISC-V 아키텍처 기반의 CH32V003 칩을 활용하여 1달러 미만의 비용으로 휴대용 게임 콘솔을 제작
Rust 언어를 사용하여 안전하고 효율적인 임베디드 시스템 개발을 시도, ESP32 경험을 바탕으로 CH32V003에 Rust 지원을 구현
성능 최적화를 위해 부동 소수점 연산을 제거하고 고정 소수점 연산을 도입하여 1FPS에서 30+FPS로 성능 향상
128x64 픽셀 OLED 디스플레이를 위한 128바이트의 램(RAM) 버퍼를 활용, 맵 데이터를 ROM에 저장하여 렌더링 속도 개선
CH32V003 칩의 제약과 Rust의 선택
CH32V003 칩은 2KiB RAM과 16KiB 플래시 메모리를 가진 32비트 마이크로컨트롤러로, 제한된 하드웨어 환경(Constrained Hardware Environment)에서 Rust를 사용한 것은 주목할 만하다. 특히, 안전성과 성능을 동시에 확보해야 하는 임베디드 시스템 개발에 Rust가 적합함을 보여준다. ch32-hal 프로젝트를 통해 Rust 지원을 구현하여, 개발자는 안전한 코드를 작성하면서도 하드웨어에 직접 접근할 수 있었다.
성능 최적화를 위한 고정 소수점(Fixed-Point) 연산
초기 구현에서 부동 소수점(Floating-Point) 연산의 사용은 1FPS의 심각한 성능 저하를 야기했다. CH32V003 칩은 하드웨어 부동 소수점 연산을 지원하지 않아, 소프트웨어 에뮬레이션을 거쳐야 했기 때문이다. 고정 소수점(Fixed-Point) 연산으로 전환하여, 30+FPS로 성능을 대폭 향상시켰다. 이는 임베디드 시스템(Embedded System)에서 성능 최적화를 위한 중요한 트레이드오프(Trade-off)를 보여준다.
디스플레이 드라이버 및 렌더링 최적화
128x64 픽셀 OLED 디스플레이를 위해 128바이트의 RAM 버퍼를 활용하는 대신, 디스플레이 자체의 지속성(Persistence)을 활용하여 렌더링 성능을 최적화했다. 8x8 타일 기반의 맵 데이터를 ROM에 저장하고, 바운딩 박스 컬링(Bounding Box Culling)을 통해 렌더링할 객체를 선택적으로 처리하여 성능을 개선했다. 이러한 기법은 제한된 메모리 환경에서 효율적인 렌더링 파이프라인(Rendering Pipeline)을 구축하는 데 중요한 역할을 한다.
Rust 언어의 장점과 개발 생산성
Rust는 안전성, 속도, 표현력을 모두 갖춘 언어로, 임베디드 시스템 개발에 적합하다는 것을 보여준다. 특히, fixed crate를 사용하여 고정 소수점 연산을 쉽게 구현할 수 있었으며, operator overloading을 통해 일반적인 숫자처럼 사용할 수 있었다. 또한, 데스크톱 앱으로 게임 로직을 개발하고, 하드웨어에 포팅하는 방식을 통해 개발 생산성을 높였다. 안전한 메모리 관리(Safe Memory Management)는 버그 발생 가능성을 줄이는 데 기여했다.