9센트 칩으로 만든 휴대용 게임 콘솔, Rust로 30FPS 달성!

by DD
1개월 전
조회수 10

9센트(0.09$) RISC-V 기반의 CH32V003 칩을 활용하여 저가형 게임 콘솔(Low-cost Gaming Console)을 제작

Rust 언어(Rust Language)를 사용하여 안전하고 효율적인 임베디드 시스템 개발을 시도, 특히 메모리 제약 환경에서 성능 최적화에 집중

부동 소수점 연산(Floating-point Math)의 성능 저하 문제를 해결하기 위해 고정 소수점 연산(Fixed-point Math)을 도입하여 30FPS 이상 달성

OLED 디스플레이(OLED Display)를 위한 128바이트의 램(RAM) 버퍼를 활용, 바운딩 박스 컬링(Bounding Box Culling) 시스템을 통해 렌더링 성능 개선

CH32V003 칩의 제약과 Rust의 선택

본 프로젝트는 2KiB RAM과 16KiB 플래시 메모리를 가진 CH32V003 칩을 사용, 임베디드 시스템(Embedded System) 개발의 어려움을 보여준다. 특히, Rust 언어의 메모리 안전성(Memory Safety)성능(Performance)을 활용하여 이러한 제약 속에서도 게임을 구현했다. 개발자는 Rust의 안전한 메모리 관리 기능을 통해 하드웨어 제약에 효과적으로 대응하고, 동시에 안정적인 코드(Stable Code)를 유지할 수 있었다.

성능 최적화를 위한 고정 소수점 연산

초기 구현에서 부동 소수점 연산의 성능 저하를 해결하기 위해 고정 소수점 연산(Fixed-point Math)을 도입했다. CH32V003 칩은 하드웨어 부동 소수점 연산 장치(FPU)를 지원하지 않아, 소프트웨어 에뮬레이션을 사용해야 했다. 개발자는 32비트 정수를 활용하여 고정 소수점 값을 표현하고, fixed crate를 통해 연산자 오버로딩(Operator Overloading)을 구현하여 성능을 30FPS 이상으로 향상시켰다. 이는 임베디드 환경(Embedded Environment)에서 성능 최적화의 중요성을 보여주는 사례이다.

OLED 디스플레이를 위한 램(RAM) 활용

제한된 RAM 환경에서 OLED 디스플레이를 위한 128바이트의 램(RAM) 버퍼를 활용하는 기술을 선보였다. 개발자는 SSD1306 디스플레이 드라이버(SSD1306 Display Driver)를 직접 사용하여 128x64 픽셀 디스플레이를 제어했다. 특히, 디스플레이의 픽셀 지속성을 활용하여 램(RAM) 버퍼를 흉내 내는 방식으로 메모리 제약을 극복했다. 또한, 바운딩 박스 컬링(Bounding Box Culling)을 통해 렌더링 성능을 최적화하여, 제한된 하드웨어 자원 내에서 게임을 구현했다.

Rust 기반 게임 엔진 설계

본 프로젝트는 플랫폼 독립적인 게임 엔진을 설계하여 개발 효율성을 높였다. 개발자는 Mac 환경에서 minifb를 사용하여 게임 로직을 개발하고, 렌더링 레이어를 CH32V003 칩으로 이식했다. 이러한 접근 방식은 개발 프로세스를 분리하여, 디버깅(Debugging)테스트(Testing)를 용이하게 했다. 또한, 코드 재사용성을 높여, 다양한 하드웨어 플랫폼으로의 확장을 가능하게 했다.

Using Rust to Build a $1 Handheld Gaming Console