Rust로 배우는 비디오 게임 에뮬레이션 입문
비디오 게임 에뮬레이터 개발은 개발자들 사이에서 점점 더 인기 있는 취미 프로젝트가 되고 있습니다. 에뮬레이터를 제대로 만들려면 저수준 하드웨어, 현대 프로그래밍 언어, 그래픽 시스템에 대한 지식이 필요합니다. 에뮬레이터는 훌륭한 학습 프로젝트입니다. 목표가 분명할 뿐 아니라, 직접 작성한 에뮬레이터에서 게임이 제대로 돌아가는 것을 보면 큰 보람을 느낄 수 있습니다. 저는 아직 에뮬레이션 개발을 시작한 지 얼마 되지 않았지만, 온라인의 훌륭한 가이드와 튜토리얼이 없었다면 지금에 이르지 못했을 것입니다. 그래서 제가 익힌 몇 가지 요령을 담은 가이드를 써서 커뮤니티에 보답하고자 합니다. 이 가이드가 누군가에게 도움이 되기를 바랍니다.
Chip-8 소개
우리가 목표로 하는 시스템은 Chip-8입니다. Chip-8은 일종의 에뮬레이션 개발계의 “Hello World“가 되었습니다. NES나 Game Boy처럼 더 흥미로운 것부터 시작하고 싶을 수도 있지만, 이들은 Chip-8보다 한 단계 더 복잡합니다. Chip-8은 1비트 흑백 디스플레이, 단순한 1채널 단음 오디오, 그리고 단 35개의 명령어(Game Boy는 약 500개)만 갖추고 있습니다. 이에 대해서는 뒤에서 더 자세히 다루겠습니다. 이 가이드에서는 Chip-8의 기술적 세부 사항, 어떤 하드웨어 시스템을 어떻게 에뮬레이션해야 하는지, 그리고 사용자와 상호 작용하는 방법을 다룹니다. 이 가이드는 원래의 Chip-8 사양에 집중하며, Super Chip-8, Chip-16, XO-Chip처럼 지금까지 제안된 여러 확장은 구현하지 않습니다. 이러한 확장들은 서로 독립적으로 만들어졌기 때문에 서로 모순되는 기능을 추가합니다.
Chip-8 기술 사양
-
64x32 흑백 디스플레이. 항상 너비 8픽셀, 높이 1~16픽셀인 스프라이트로 그립니다.
-
V0부터 VF까지로 불리는 16개의 8비트 범용 레지스터. VF는 오버플로 연산을 위한 플래그 레지스터로도 쓰입니다.
-
16비트 프로그램 카운터
-
메모리 접근용 포인터로 쓰이는 16비트 레지스터 하나. I 레지스터라고 부릅니다.
-
RAM 용량은 표준화되어 있지 않지만, 대부분의 에뮬레이터는 4 KB를 할당합니다.
-
서브루틴을 호출하고 복귀하는 데 쓰이는 16비트 스택
-
16키 키보드 입력
-
매 프레임마다 감소하며 0에 도달하면 작동하는 특수 레지스터 두 개:
- 지연 타이머: 시간 기반 게임 이벤트에 사용합니다.
- 사운드 타이머: 오디오 비프음을 울리는 데 사용합니다.
Rust 소개
에뮬레이터는 거의 모든 프로그래밍 언어로 작성할 수 있습니다. 이 가이드에서는 Rust 프로그래밍 언어를 사용하지만, 여기서 설명하는 단계는 어떤 언어에도 적용할 수 있습니다. Rust에는 여러 가지 큰 장점이 있습니다. 주요 플랫폼을 대상으로 컴파일할 수 있는 컴파일 언어이며, 프로젝트에 활용할 외부 라이브러리를 만드는 커뮤니티도 활발합니다. Rust는 WebAssembly 빌드도 지원하므로, 코드를 조금만 손보고 다시 컴파일하면 브라우저에서 실행할 수 있습니다. 이 가이드는 독자가 Rust 언어의 기초와 프로그래밍 전반을 이해하고 있다고 가정합니다. 진행하면서 코드를 설명하겠지만, Rust는 학습 곡선이 높기로 악명이 높으므로 가이드를 따라가다가 익숙하지 않은 개념이 나오면 훌륭한 공식 Rust 책을 읽고 참고하시기를 권합니다. 또한 이 가이드는 Rust가 설치되어 있고 제대로 작동한다고 가정합니다. 필요하다면 사용하는 플랫폼의 설치 안내를 참고하십시오.
필요한 것
시작하기 전에 다음 항목을 사용할 수 있는지, 또는 설치되어 있는지 확인하십시오.
텍스트 편집기
이 프로젝트에는 어떤 텍스트 편집기든 사용할 수 있지만, 구문 강조, 코드 제안, 디버거 지원 등 Rust용 기능을 제공하는 두 가지를 추천합니다.
-
제가 Rust 개발에 선호하는 편집기는 Visual Studio Code이며, rust-analyzer 확장과 함께 사용합니다.
-
JetBrains는 Rust 전용 IDE를 제공하지 않지만, 다른 여러 제품에서 쓸 수 있는 Rust 확장을 제공합니다. CLion용 확장에는 통합 디버거 지원처럼 다른 제품용 확장에는 없는 기능이 더 있습니다. CLion은 유료 제품이라는 점을 기억하십시오. 다만 30일 체험판을 제공하며, 학생에게는 더 긴 무료 사용 기간을 제공합니다.
이 중 어느 것도 마음에 들지 않는다면, 다른 여러 편집기에도 Rust 구문 및 자동 완성 플러그인이 있으며, gdb 같은 다른 여러 디버거로도 꽤 쉽게 디버깅할 수 있습니다.
테스트 ROM
실행할 것이 없다면 에뮬레이터는 별 쓸모가 없습니다! 이 책의 소스 코드에는 널리 배포된 Chip-8 프로그램이 여러 개 포함되어 있으며, 여기에서도 찾을 수 있습니다. 이 가이드 곳곳에서 이 게임 중 일부를 예시로 보여 드리겠습니다.
기타
진행하면서 도움이 될 만한 기타 항목은 다음과 같습니다.
-
16진수 표기법이 익숙하지 않다면 다시 한번 복습하십시오. 이 프로젝트 전반에 걸쳐 많이 사용됩니다.
-
Chip-8 게임은 바이너리 형식이므로, 디버깅할 때 원시 16진수 값을 볼 수 있으면 도움이 되는 경우가 많습니다. 일반 텍스트 편집기는 대개 파일을 16진수로 보는 기능을 지원하지 않으므로, 전용 16진수 편집기가 필요합니다. 많은 편집기가 비슷한 기능을 제공하지만, 저는 개인적으로 Reverse Engineer’s Hex Editor를 선호합니다.
시작합시다!