불가능한 이식에 관한 이야기: Quake가 Game Boy Advance로 이식된 방법

Quake를 Game Boy Advance에 포팅하는 것은 불가능해 보였지만 Randy Linden이 가까스로 해냈습니다. 방법은 다음과 같습니다.

게임보이 어드밴스(Game Boy Advance)는 닌텐도가 만든 휴대용 게임 콘솔입니다. 2001년 일본에서 출시되어 게임보이 컬러의 후속작으로 사용되었습니다. 16.78MHz로 클럭된 ARM7TDMI, 32kb 내부 작업 RAM, 256kb 외부 RAM 및 96kb VRAM을 가졌습니다. 가장 강력한 기계는 아니지만 많은 사람들이 기억에 남는 휴대용 게임이 많이 있습니다. 하지만 장치에 대해 결코 빛을 보지 못한 게임 중 하나는 오늘날 우리가 알고 있는 1인칭 슈팅 장르를 정의하는 데 도움을 준 id Software에서 개발한 게임인 Quake의 프로토타입 포트였습니다.

Quake는 환상적인 사운드트랙과 중독성 있는 게임 플레이를 갖춘 믿을 수 없을 정도로 상세한 게임이며, DOOM과 마찬가지로 여러분이 생각할 수 있는 거의 모든 장치에 이식되었습니다. Game Boy Advance로의 포팅은 기본적으로 3D 그래픽을 지원하지 않기 때문에 특히 놀랍습니다. Nintendo는 특히 핸드헬드를 2차원 게임 플레이 경험으로 마케팅했습니다. 그래도 Randy Linden이 자신의 포트를 개발하는 것을 막지는 못했습니다.

Modern Vintage Gamer의 허가를 받아 아날로그 포켓에서 재생되는 Quake 포트 사진

Linden에 대해 잘 모르신다면 그는 두 가지 블렘의 개발자로 가장 잘 알려져 있을 것입니다! (PlayStation 에뮬레이터) 및 DOOM의 SNES 포트는 id Software의 공동 창립자인 John Romero가 인터뷰에서 한 번 말한 성과입니다. 샤크뉴스 그는 가능하다고 생각하지 않았습니다. Linden의 개발 능력은 누군가 Quake on the Game Boy Advance를 현실로 만들 수 있다면 아마도 그 사람일 것이라는 점을 입증했습니다.

이 포트는 Linden이 Forest of Illusion 프로젝트를 통해 자체적으로 출시한 덕분에 밝혀졌습니다. Forest of Illusion은 Nintendo 게임의 역사를 보존하기 위한 프로젝트이며, Linden은 그는 자신의 컴퓨터에 있는 256MB 플래시 카드에서 찾은 Quake 포트의 복사본을 배포하기 위해 연락했습니다. 소유.

시간을 내어 질문에 답변하고 이 기사의 기술적 정확성을 보장해 준 Randy Linden에게 감사의 말씀을 전하고 싶습니다. 우리는 또한 감사하고 싶습니다 모던 빈티지 게이머 그의 비디오에서 필요한 스틸 이미지를 사용할 수 있도록 허락해 주셔서 감사합니다. 이 포트는 id Software 또는 ZeniMax와 공식적인 관계가 없으며 Linden의 단독 프로젝트로 개발되었습니다.

Quake의 Game Boy Advance 포트

기술적으로 말하자면, Quake가 Game Boy Advance와 같은 수준까지 실행될 수 있다는 것은 놀라운 일입니다. 좋은 프레임 속도로 실행되며 원래 Quake 게임의 올바른 조명과 색상 팔레트를 유지합니다. 무기와 몬스터를 포함한 모든 것이 3D입니다. Game Boy Advance의 게임은 일반적으로 스프라이트를 통해 3D 그래픽을 구현했지만 이것이 현실이었습니다. 다른 3D 게임이 휴대용 게임기에서 했던 방식처럼 레이 캐스팅을 사용하지 않으며 심지어 포인트를 달성하기도 합니다. 동적 환상을 달성하기 위해 팔레트 변경 트릭을 통해 사전 렌더링된 객체에 조명 효과를 적용합니다. 조명.

분명히 말하면, 이 포트는 정식 게임이 아니며, 출시를 위해 완성된 후 Linden이 id Software에 가져가려고 의도한 프로토타입입니다. 그러나 Game Boy Advance의 인기는 시들기 시작했고 대신 Linden이 작성한 커스텀 엔진은 나중에 Linden이 완전히 개발한 또 다른 게임인 Cyboid의 엔진이 되었습니다. Linden은 "코드의 큰 부분"이 여전히 Game Boy Advance 버전의 원본 ARM 코드라고 말합니다. Cyboid를 사용해 보고 싶다면 Google Play 스토어에서 이전 버전을 사용할 수 있지만 공식 APK는 이제 다음 위치에 배포됩니다. 아마존 앱스토어 게임에 로우레벨 32비트 코드가 많기 때문입니다.

사이보이드개발자: R 앤 R 디지털, LLC.

가격: 무료.

3.3.

다운로드

Linden은 또한 Cyboid의 초기 버전 중 하나인 iPod Video에서 실행되는 자신의 코드에 대한 비디오를 우리와 공유했습니다. 이것은 Game Boy Advance에 대한 Quake 포트에 사용된 것과 동일한 엔진 코드를 기반으로 구축되었습니다.

Quake의 Game Boy Advance 포트에는 Linden이 포함하지 않은 것처럼 게임의 공식 자산이 포함되어 있지 않습니다. 공식 Quake가 포함된 E1M1 버전 배포에 대해 id Software 또는 ZeniMax에 문의했습니다. 자산.

현재 배포 중인 게임도 디버그 빌드입니다. 부팅 시 R 키를 누르고 있으면 플레이어가 게임의 두 번째 맵으로 바로 이동하고 D 패드를 왼쪽으로 누르면 세 번째 맵으로 이동합니다. 플레이어가 죽을 때 지도 교환에 액세스할 수도 있으며, 플레이어가 먼저 총을 쏠 때까지 몬스터는 플레이어를 공격하지 않습니다.

음악의 경우 데모에서는 공개 .S3M 파일을 사용하고 사운드 믹서는 스테레오 음악과 사운드 효과를 모두 처리합니다.

기술적 경계

Game Boy Advance에는 이를 어려운 포트로 만든 여러 가지 경계가 있었습니다. 가장 큰 장애물 중 일부는 낮은 클럭 속도, 핸드헬드의 3D 그래픽 기능 부족, 부동 소수점 장치(FPU) 부족이었습니다. 그 과정에서 다른 많은 문제도 있었지만 Linden이 나에게 문제가 된다고 설명한 특별한 문제점은 바로 이것이었습니다. 시작하기 전에 Game Boy Advance의 레이아웃을 이해하는 것이 중요합니다.

Modern Vintage Gamer의 허가를 받아 사용된 스크린샷

Game Boy Advance에는 세 가지 RAM 세트가 있습니다. 하나는 내부 작업 RAM(IWRAM), 다른 하나는 외부 작업 RAM(EWRAM), 세 번째는 비디오 RAM(VRAM)입니다. 32kb의 IWRAM은 빠른 실행을 위해 ARM 명령어를 저장하는 데 사용되는 반면, 256kb의 EWRAM은 Thumb 전용 명령어와 더 작은 데이터 청크를 저장하는 데 최적입니다. 처럼 로드리고 코페티 노트, EWRAM은 IWRAM보다 액세스 속도가 최대 6배 느릴 수 있습니다. EWRAM 형태의 메모리 대부분은 Game Boy Advance가 32비트 휴대용 기기로 판매되고 있음에도 불구하고 16비트 버스를 통해서만 액세스할 수 있습니다. IWRAM은 32비트 버스를 통해 액세스할 수 있습니다. Game Boy Advance의 VRAM은 96kb로 제공되며 주로 그래픽 데이터 저장용이지만 CPU의 메모리 맵에 있으며 일반 메모리 저장소로도 사용할 수 있습니다.

Thumb 명령어는 32비트 ARM 명령어의 하위 집합이며 16비트 단어로 인코딩된 명령어 세트입니다. 많은 공간을 차지하지 않고도 32비트 명령어의 모든 이점을 누릴 수 있으므로 최적화된 개발에 효율적입니다. 즉, EWRAM은 액세스 속도가 느리지만 효율적인 Thumb 명령어는 저장된 ARM 명령어만큼 빠를 수 있습니다. IWRAM에서는 Thumb 명령어의 단점은 때로는 원하는 ARM 명령어에 해당하는 Thumb이 없다는 것입니다. 실행하다. EWRAM은 기본적으로 래스터화 코드에 의해 스캔라인별로 추적된 다각형 가장자리 목록인 3D 수학 변환 논리의 출력을 저장하는 데 사용되었습니다.

Linden이 말했듯이 전체 포트에서 가장 복잡하고 어려운 부분은 스캔라인 렌더러였습니다. 이는 VRAM에 픽셀 세트를 그리도록 설계된 10,000개 이상의 고도로 최적화된 ARM 어셈블리 코드 라인으로 구성됩니다. 스캔라인 렌더러는 32kb IWRAM의 대부분을 사용했습니다. 카메라에 가장 가까운 가장자리가 활성화되어 렌더링되며 본질적으로 대규모 BSP(Binary Space Partitioning) 트리입니다. IWRAM이 충분하지 않았기 때문에 다각형 변환 출력 결과를 엣지 테이블에 저장하는 데 VRAM이 사용되었지만 Game Boy Advance의 VRAM은 여전히 ​​EWRAM보다 빠릅니다. 그래픽도 여기에 저장되고 표시되었습니다.

그는 가능한 가장 빠른 실행 시간을 얻을 수 있도록 최적화에 집중하는 데 많은 시간을 보냈습니다. 실행 시간을 단축하기 위해 그가 수행한 세 가지 작업은 다음과 같습니다.

  • 코드가 실행되기 전에 자체 수정되었으므로 더 적은 명령이 필요했습니다.
  • 역수, 사인, 코사인, 탄젠트 등과 같은 항목에 대해 일련의 조회 테이블을 사용했습니다.
  • 레지스터 값을 저장하고 복원할 필요 없이 추가 레지스터("변수"와 유사)에 액세스할 수 있도록 CPU "모드"를 전환했습니다.

추가 레지스터를 얻기 위해 CPU 모드를 전환하는 것은 단일 클록 주기에서 검색할 수 있도록 CPU에 가까운 값에 빠르게 액세스할 수 있게 해주는 믿을 수 없을 만큼 영리한 방법입니다. Linden이 말했듯이 Game Boy Advance의 RAM에 값을 저장하는 데 시간이 오래 걸리는 것과는 달리 레지스터를 전환하고 한 클럭 주기로 값을 검색하는 것이 가능했습니다. CPU 자체는 16.78MHz 프로세서이므로 초당 16780000사이클을 완료할 수 있습니다. 많은 양처럼 들리지만 화면의 모든 픽셀을 계산하고 그려야 할 경우 이러한 작업은 빠르게 합산되므로 최대한 많은 작업을 줄이는 것이 중요합니다.

위는 Game Boy Advance에 내장된 ARM7TDMI 칩셋의 일반 레지스터 목록입니다. 일반적으로 개발자는 "시스템 및 사용자" 모드 내에서만 레지스터에 액세스하고 그 외부에서는 일반 변수를 사용합니다. 그러나 그는 칩셋의 7개 모드 모두에서 레지스터를 활용했는데, 가장 좋은 점은 전환 모드는 여전히 다른 모드의 레지스터 값을 유지하므로 전환 모드를 전환할 수 있습니다. 그들을.

재미있게도 Linden은 은행 전환 방법을 통해 Nanoboy Advance 에뮬레이터에서 버그를 발견한 방법도 언급했습니다. 알고 보니 그 에뮬레이터는 레지스터에 저장하고 전환하기 위해 CPU의 다른 모드를 사용하는 것을 지원하지 않았으며 그의 Quake 데모는 실제로 이를 수행한 최초의 알려진 게임이었습니다.

Linden은 자신이 만든 일부 노트의 사진을 우리와 공유하고 적절한 FPU가 없을 때 부동 소수점 계산을 최적화하는 방법을 설명했습니다.

위 이미지는 Linden이 자신의 노트에서 우리와 공유한 이미지이며, 특히 흥미로운 점은 "기타 ARM 사이클 명령어 수"입니다. 그는 계산을 위한 클록 주기 수를 줄일 수 있도록 계산 주기를 최적화하는 방법을 고안했습니다. 그가 설명했듯이 8비트 숫자는 한 클럭 사이클에, 16비트 숫자는 두 클럭 사이클에, 32비트 숫자는 세 클럭 사이클에, 64비트 숫자는 네 클럭 사이클에 곱해질 수 있습니다. .

"[ARM 프로세서에는] 두세 가지 실행 단계가 있었습니다. 예를 들어 레지스터 1에 레지스터 2를 곱하고 그 결과를 레지스터 3에 넣는다고 가정해 보겠습니다. 레지스터 1과 레지스터 2를 곱한다고 말하는 대신 레지스터 2가 16비트 숫자라는 것을 알았다면, 뒤집어서 레지스터 2에 레지스터 1을 곱하면 시계가 절약되기 때문입니다. 주기."

그는 이렇게 한 이유가 게임보이의 모든 성능을 짜내기 위해서라고 말했습니다. Advance, 계산을 많이 할 때 여기 저기 저장된 클럭 사이클이 실제로 합산되므로 수행. 자체 수정 코드에 대해서는 Linden에게 설명을 요청했습니다.

"프로그램은 [스토리지]에서 나오며, 더 빠르기 때문에 실행을 위해 프로그램의 큰 블록을 내부 RAM으로 전송합니다. 각 RAM 액세스는 훨씬 더 느리기 때문에 ROM에서 RAM으로 큰 블록의 DMA(직접 메모리 액세스)를 수행한 다음 실제 프로그램 코드를 변경합니다. 예를 들어 ARM에는 피연산자를 왼쪽이나 오른쪽으로 이동하는 기능이 있거나 명령어 세트의 일부로 특정 비트를 마스크할 수 있습니다. 명령어는 마스크할 비트 또는 이동할 비트 수를 지정합니다. 그래서 저는 이동해야 하는 비트 수에 따라 실행될 내용을 수정하는 코드를 생성했습니다. 또 다른 예는 3D 행렬 곱셈에 관한 것입니다. 거기에는 수많은 곱셈이 관련되어 있습니다. 내부 RAM에 곱셈을 수행하는 실제 명령을 생성한 다음 이를 실행하여 코드가 실행되는 동안 자체적으로 빌드된 부분을 만들었습니다."

자체 수정 코드에는 특히 디버깅과 관련하여 자체적인 단점이 있습니다. 코드가 다른 실행 시퀀스로 점프하여 메인 스레드에서 귀중한 계산 시간을 빼앗을 수 있는 분기 명령도 필요하지 않습니다. Linden은 또한 조회 테이블이 ROM에서 완벽하게 정렬되어 왼쪽으로 이동된 8비트 값의 완벽한 배수가 된다고 말했습니다. 조회 테이블의 크기는 엄청나고 RAM에 맞지 않으며 정렬을 통해 테이블의 기본 주소를 얻기 위해 추가 로드 명령이 필요하지 않습니다.

전체적으로 최종 프로토타입은 거의 2년에 걸쳐 개발되었습니다.

Randy Linden의 Quake 포트의 미래

나는 Linden에게 Quake 포트의 미래가 어떻게 될 것인지 물었고 그는 자신이 ZeniMax와 id Software에 공식 Quake 버전 출시에 대해 문의하는 것을 고려 자산. 그는 또한 언젠가 소스 코드를 공개할 것이라고 말했지만 현재는 오래된 컴퓨터가 필요하기 때문에 빌드되지 않습니다.

개발을 위해 Game Boy Advance를 컴퓨터에 연결하기 위한 Randy Linden의 설정입니다.

나는 Linden에게 왜 Quake를 선택했는지 물었고, 그는 게임을 좋아하고 이것이 "불가능한 프로젝트"라는 도전을 좋아한다고 말했습니다. 이 프로젝트는 그의 DOOM for SNES 포트와는 거리가 멀기 때문입니다. 그는 또한 공간 제약으로 인해 전체 게임이 이식될 수 있다고 믿지 않지만 게임의 대부분이 동일한 엔진에 있을 수 있다고 언급했습니다.

Game Boy Advance용 Quake를 확인하고 싶다면 Forest of Illusion에서 출시된 버전을 확인하세요. 아래에서 확인하실 수 있습니다.


환상의 숲에서 다운로드