내가 만든건 아닌데, 만드는 과정이 꽤 흥미로워서 적어놓았다.
글쓴이는 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)
재미있는 요소가 많고, 내가 실제 차용하고 싶은 요소들도 있어서 간략하게 적어 두었다. 다만 당장은 정확하게 이걸 어떻게 만들었고, 이걸 어떻게 재구성해볼 수 있을지에 대해서 구체적으로 쓸 시간이 없을 것 같다.
'개발 > Developing' 카테고리의 다른 글
Reversing Quick Note (0) | 2023.08.03 |
---|---|
Coroutines in C (0) | 2023.05.07 |
Datadog Metric의 Tag 사용할 때 유의할 점 (0) | 2023.04.10 |
Golang의 defer의 변수 캡쳐, 그리고 동작 원리 (0) | 2023.04.02 |
Python에서의 yield와 실행 순서 (0) | 2023.03.28 |