Post

멀티플레이가 가능한 mGBA, 그리고 레트로 게임들

레트로 장르는 현재 회색지대입니다.

더 좋은 기술력과 미려한 그래픽, 매력적인 게임 요소를 가진 게임들이 쏟아져나오고 있기 때문에, 저작권이 만료되어서가 아니라 새 게임들 아래 그저 깔려있습니다.

게임사 입장에서는 몇년 지나지도 않은 게임들을 계속해서 팔기에는 여러모로 부적절한 상황입니다. 이미 더 좋은 게임들이 많기 때문에 가격 책정도 어렵고 게임보이와 같은 별도 오락기 기반인 게임들은 해당 기기를 다시 만들기도 수지타산이 안맞아보입니다.

그렇다고 사람들이 고전게임을 아무 비용없이 배포하는 것을 법적으로 대응하기도 애매합니다. 왜냐면, 어쩌면 누구도 신경쓰지 않았을 오래된 게임을 무료로 경험할 수 있다는 이유로 경험하게 된다면 그들이 가진 캐릭터와 같은 IP 들은 계속해서 연명할 수 있게 되니까요.

명명백백히 따지면 분명 불법이지만 건들기는 애매한, 회색지대. 그래서 적당한 당위만 걸어두고 무료 배포를 이용하는 사람들이 있기에, 레트로 유행을 이야기하면 그게 정말 레트로가 유행하는건지, 아니면 손쉽게 올라탄 결과물로 돈을 벌고 싶어서 레트로가 유행이라고 밀어붙이는건지 저는 알 수가 없어요.

오래됐다고 하기엔 아직 30년 혹은 그 절반만큼도 되지 않은 게임기가 에뮬레이터로 개발되는 것도 모자라 게임 rom 파일도 조금만 검색하면 쉽게 다운받고 게임을 즐길 수 있습니다.

여기서 제가 찾은 재미난 포인트가 있었습니다.

대부분의 에뮬레이터는 멀티플레이를 지원하지 않습니다.

물론 전부는 아닙니다. 다만 멀티플레이 테스트에 적합한 구성이기에 친구와 함께 즐기기는 어렵죠.

이번에 제가 포크해서 마개조한 mgba 는 게임 보이 어드벤스 에뮬레이터입니다. 제가 어렸을 때 누렸던 유일한 게임기죠.

게임보이는 게임기를 가진 사람들끼리 선을 연결하여 멀티 플레이를 할 수 있었습니다. mgba 에서는 그 선을 가상으로 구현해 멀티플레이를 구현해두었는데 PC 한대에서 창이 4개 떴기 때문에 친구와 즐기기에 부적합했습니다. mgba는 유명한 오픈 프로젝트라 wasm-mgba 같은 웹 포팅도 있어서 웹 브라우저에서 롬만 올리면 게임을 실행할 수 있습니다. 근데 멀티가 없어요.

이건 기술적 한계 때문인데요. 게임보이의 통신은 마치 시리얼 통신처럼 거의 실시간에 가까운 통신을 요구합니다. 그래서 같은 로컬망 (공유기)를 사용할 정도로 가까이 있더라도 아주 미세한 지연 (16ms 미만)으로도 동기화가 깨지고 연결이 끊어질 수 있습니다. 그래서 이를 우회하는, 지연을 좀 허용해주는 우회법이 있지만 아주 적은 량의 통신 (예를 들면, 포켓몬 교환하기 같은 일시적 이벤트)은 어떻게든 해낼 수 있었습니다만 통신의 실시간 필요성이 높아지면 (예를 들면 별의 커비: 거울 대미궁) 진행을 할 수 없는 단점이 있습니다.

그리고 제 생각은 좀 달랐어요. 그러니까, 이렇게 생각한겁니다.

평균 기기 사양이 높아졌으니 에뮬레이터 4대 정도는 한 기기에서 돌릴 수 있지 않나?

그러니까, 기존의 방식처럼 각각 에뮬레이터를 돌리고 원격 연결을 하는게 아니라 호스트(방장)가 에뮬레이터 4대를 돌리고 참여자(2p, 3p, 4p)에게 화면과 소리를 공유, 사용자 인풋만 받아서 에뮬레이터에 전달하는 방식입니다. 그리고 이 짓거리를 브라우저에서 해보고 있습니다. 브라우저는 접근성이 좋으니까요.

브라우저는 기본적으로 싱글스레드입니다. 그래서 대단히 심하게 삽질을 해버렸고, 싱글스레드로는 감당하기 어렵다고 잠정적 결론을 내렸습니다. 그럼에도 적당한 수준까지 끌어올린 이유는 github 호스팅은 sab 를 지원하지 않기 때문에 싱글스레드로 꼭 완성해보고 싶다는 욕심이었어요..

그렇게 나온 페이지가 mgba 페이지 입니다. 1인 플레이는 매우 쾌적합니다. 2인 멀티플레이는 조금 플레이되다가 연결이 끊어집니다. (상태 머신 동기화 실패로 추정중) 3인 멀티플레이부터는 테스트 이상으로는 추천하지 않습니다. 프레임 저하가 심해요.

이 글 작성 이후로는 현재까지 진행된 내용을 다시 비틀어서 멀티스레드 구성을 할 예정입니다. sab가 설정된 서버에서 원활하게 실행하거나, 혹시 운이 좋으면 worker 만으로도 다수 에뮬레이터 재생에 부하가 줄어들 수 있었으면 좋겠네요.

This post is licensed under CC BY 4.0 by the author.