PS2 4분 소요

PS2 게임을 브라우저로 옮긴다면, 게임 보존은 쉬워질까?

핵심 요약

  • 정적 재컴파일은 게임의 기계어 코드를 실행 전에 다른 환경에서 쓸 수 있는 코드로 바꾸는 방식입니다.
  • WebAssembly는 번역한 코드를 브라우저에서 실행하는 데 쓸 수 있습니다.
  • PS2 게임을 제대로 재현하려면 CPU 코드뿐 아니라 그래픽과 벡터 연산 등도 처리해야 합니다.
  • 게임을 보존하려면 실행 파일과 함께 변환 도구, 설정, 재현 방법을 남겨야 합니다.

오래된 게임을 다시 하려다 게임을 하는 시간보다 실행 환경을 준비하는 데 더 많은 시간을 쓰곤 합니다. PS2 게임을 브라우저에서 실행한다는 발상이 반가운 이유도 여기에 있습니다. 실행까지 거쳐야 할 단계가 줄어들면, 추억의 게임을 직접 해볼 기회도 늘어날 수 있습니다.

정적 재컴파일은 게임 코드를 미리 번역합니다

PS2 게임에는 PS2의 프로세서가 이해하는 기계어 명령이 들어 있습니다. 오늘날의 PC나 브라우저는 이 명령을 그대로 실행할 수 없습니다. 다른 환경에서도 같은 동작을 하려면 중간에 코드를 바꾸는 작업이 필요합니다.

정적 재컴파일은 이 작업을 게임 실행 전에 해두는 방식입니다. 예를 들어 게임의 기계어를 C나 C++ 같은 언어의 코드로 바꾼 뒤, 컴파일러로 실행할 환경에 맞는 코드를 만듭니다. 여기서 컴파일러란 사람이 작성하거나 도구가 만든 코드를 실제로 실행할 수 있는 형태로 바꾸는 프로그램을 말합니다.

동적 재컴파일은 실행 중에 필요한 코드를 번역하지만, 정적 재컴파일은 그 일을 미리 합니다. 다만 번역을 먼저 해뒀다고 해서 반드시 더 빠르거나 정확한 것은 아닙니다. 어느 부분까지 변환하고 나머지 동작은 어떻게 처리하느냐에 따라 결과가 달라집니다.

정적 재컴파일을 원본 소스 코드 복원과 혼동해서는 안 됩니다. 개발자가 붙인 변수 이름이나 코드를 그렇게 설계한 이유까지 되찾는 작업은 아닙니다. 다른 환경에서도 원래 프로그램과 같은 동작을 하도록 코드를 바꾸는 일입니다.

PS2는 CPU 코드만 바꾸면 끝나는 기계가 아닙니다

게임 코드를 소설처럼 번역한다고 생각하면 간단해 보입니다. 명령을 하나씩 바꿔 적으면 될 것 같으니까요. 하지만 게임이 돌아가려면 여러 장치가 서로 맞물려 움직여야 합니다.

PS2에는 주 CPU 외에도 벡터 연산을 담당하는 유닛과 그래픽 하드웨어 등이 있습니다. 벡터 연산은 여러 숫자를 묶어 계산하는 방식으로, 게임 속 좌표나 움직임을 처리하는 데 쓰입니다. 게임을 옮길 환경에서도 이 장치들이 하던 일을 처리할 수 있어야 합니다.

장치끼리 데이터를 주고받는 순서와 시점도 맞아야 합니다. 화면이 한 번 나왔다고 해서 게임이 끝까지 정상으로 작동한다고 볼 수는 없습니다. 특정 장면에서만 그래픽이 깨지거나 소리와 영상의 타이밍이 어긋날 수도 있어, 확인해야 할 범위가 다릅니다.

코드를 분석하는 단계부터 까다로운 문제가 있습니다. 실행 파일 안에서 어느 부분이 명령이고 어느 부분이 데이터인지 구분해야 합니다. 실제로 실행할 때에야 호출 대상이 정해지는 코드도 처리해야 합니다.

그래서 정적 재컴파일을 적용하더라도 하드웨어 동작을 흉내 내는 지원 코드가 필요할 수 있습니다. 코드 번역과 함께 하드웨어 재현 문제도 풀어야 게임을 제대로 실행할 수 있습니다.

WebAssembly가 바꾸는 것은 실행 장소입니다

정적 재컴파일이 코드를 옮기는 방법이라면, WebAssembly는 옮긴 코드를 실행할 때 쓸 수 있는 형식입니다. 줄여서 Wasm이라고도 부릅니다. C나 C++ 등으로 작성한 프로그램을 브라우저에서 실행할 수 있는 형태로 컴파일할 때 사용합니다.

PS2 게임에 적용한다면 이런 순서가 가능합니다. 먼저 게임 코드를 다른 언어로 바꾼 뒤, 실행에 필요한 지원 코드와 함께 WebAssembly로 컴파일합니다. 브라우저는 이 코드를 실행하면서 화면 출력과 입력, 소리 등을 연결합니다.

물론 WebAssembly가 PS2를 자동으로 이해해주는 것은 아닙니다. 화면을 그리려면 브라우저의 그래픽 기능을 연결해야 하고, 컨트롤러 입력과 저장 데이터 처리도 따로 구현해야 합니다.

이 방식이 잘 작동하면 이용자가 실행을 위해 준비할 일이 줄어듭니다. 웹페이지에서 실행 환경을 불러온 다음, 안내에 따라 게임 데이터를 제공해 플레이하도록 만들 수 있기 때문입니다. 실제로 얼마나 간편해질지는 어떻게 구현하느냐, 게임마다 무엇이 필요하냐에 따라 달라집니다.

브라우저에서 실행된다고 해서 모든 기기에서 같은 성능을 기대할 수는 없습니다. 기기의 성능도 다르고 브라우저마다 지원하는 기능에도 차이가 있습니다. 웹으로 옮기면 게임을 배포하고 접하는 방식은 바뀌지만, 호환성 문제까지 모두 없어지지는 않습니다.

게임 보존의 기준은 ‘한 번 실행’보다 높습니다

게임 보존에서 가장 기대되는 점은 오래된 작품을 더 쉽게 접할 수 있다는 것입니다. 작품을 연구하거나 소개할 때 실행 준비가 간단해지면, 실제 플레이를 살펴볼 기회도 늘어납니다. 스크린샷만으로는 알기 어려운 조작감과 화면 전환을 직접 경험할 수 있습니다.

하지만 게임이 실행되는 웹페이지 하나만 남겨서는 충분하지 않습니다. 사이트 운영이 끝나거나 브라우저 환경이 바뀌면 다시 실행하기 어려워질 수 있습니다. 나중에 다른 사람이 같은 결과를 재현할 수 있어야 보존의 가치도 커집니다.

그러려면 변환 도구와 빌드 방법도 남겨야 합니다. 어떤 게임 판본을 썼고 어떤 수정과 설정이 필요한지 알아야 다시 실행할 수 있습니다. 정상 작동을 확인한 구간은 어디까지인지, 알려진 오류는 무엇인지도 기록해야 합니다.

실행 기술과 게임 데이터의 확보도 따로 생각해야 합니다. 코드를 옮기는 도구가 있다고 해서 그래픽, 음악, 영상 같은 게임 자산이 저절로 생기지는 않습니다. 기술이 공개됐다는 이유만으로 원작 전체를 자유롭게 배포해도 된다고 해석해서도 안 됩니다.

정적 재컴파일과 WebAssembly를 함께 쓰면 PS2 게임을 더 쉽게 접할 수 있을지도 모릅니다. 이를 오래 보존하려면 실행 결과와 함께 같은 환경을 다시 만드는 방법까지 남겨야 합니다. 오늘 게임 화면을 열 수 있는 데서 그치지 않고, 다음 세대도 그 화면을 열 수 있도록 필요한 조건을 남기는 일입니다.

PS2 WebAssembly 게임 보존

댓글

    댓글을 불러오는 중...