개발/Developing

[정리] Super Mario Bros. 스피드런 조합 비디오 제작과정

lazykuna 2023. 6. 22. 00:34

내가 만든건 아닌데, 만드는 과정이 꽤 흥미로워서 적어놓았다.

글쓴이는 5162번의 슈퍼마리오 스피드런을 수행했는데, 이 비디오를 모아서 한번에 합성시키는 작업을 해 보았다고 하였다. (아래 비디오)

키 입력이나 에뮬레이션 상태가 아닌 실제 비디오를 인풋으로 사용한 것이 꽤 흥미롭다.

(2) The Unseen Side of Speedrunning - 4:58.941 All Attempts [SMB1 Any%] - YouTube

 

그리고 이 작업을 위해서 별도의 툴을 사용했다고 한다. 직접 만들었다고 하고, c++ / sqlite(굳이?) / torchlib / opencv / imgui 를 사용했다고 한다. 이것만 사용해서 이런 툴셋이 나오는 게 가능한가 ...?

(2) The Unseen Side of Speedrunning - How it was made - YouTube

 

글쓴이는 이 영상을 제작하기 위해서 머신러닝을 사용했다고 한다. 하지만 머신러닝이 사용된 곳은 의외로 한정적인데, 바로 각 장면의 상태를 분류하기 위해서 사용한 것이 전부라고 한다. 아마 비디오 데이터가 비교적 왜곡이 없기 때문에 머신러닝으로 쉽게 분류가 가능했을 것이리라 생각된다.

그리고 각 장면의 "상태" - 그러니까 맵에서의 x 좌표, 마리오의 위치, 이외 적들의 위치 등 - 을 파악하기 위해서 모든 스프라이트를 미리 정의해 둔 후, Template matching / FFT 를 이용하여 그 상태를 추론한다고 한다. 의외로 여기에서는 머신러닝을 사용하지 않았다고 한다. 마찬가지로 인풋의 왜곡이 적은 편이라 가능했을 것이라고 생각한다. 이미지 FFT는 어떻게 수행한 건지 잘 모르겠다. 해본 적이 없어서...

맵 이미지도 마찬가지로 모두 정의해 놓았다고 한다. 이것과 대조해서 x좌표를 추출하는 것으로 보인다. 전체 맵 이미지를 추출하기 위한 작업을(disassembly) 한 포스트가 별도로 또 있는데 마찬가지로 흥미롭다. Extracting Super Mario Bros levels with Python - Matt's Ramblings (matthewearl.github.io)


재미있는 요소가 많고, 내가 실제 차용하고 싶은 요소들도 있어서 간략하게 적어 두었다. 다만 당장은 정확하게 이걸 어떻게 만들었고, 이걸 어떻게 재구성해볼 수 있을지에 대해서 구체적으로 쓸 시간이 없을 것 같다.