1P by GN⁺ | ★ favorite | 댓글 1개
  • Another World / Out of This World의 VM, blitter, rasterizer를 표준 CPU 없이 FPGA 하드웨어로 구현한 개인 오마주 프로젝트
  • 핵심 설계는 VM을 실제 커스텀 프로세서로 만들고, 프레임버퍼 간 복사·채우기를 담당하는 blitter와 폴리곤을 그리는 rasterizer, 디스플레이 갱신을 묶는 SOC로 구성됨
  • Lattice UP5K의 128KB SPRAM은 4비트 320x200 프레임버퍼 4개에 맞으며, 각 SPRAM 블록 32KB가 하나의 프레임버퍼에 대응하는 메모리 배치
  • 게임 데이터는 저장소에 포함되지 않으며, BANK01~BANK0DMEMLIST.BINGAMEDATA 폴더에 복사해야 데이터 패키지와 bitstream 사용이 가능함
  • 실행 방식은 시뮬레이션과 실제 보드를 모두 대상으로 함
    • 시뮬레이션은 Silice 설치 후 make simul1로 인트로 실행 가능함
    • 하드웨어는 icebreaker + VGA PMOD, mch2022 badge, ULX3S HDMI를 지원함
    • 미리 빌드된 bitstream이 포함되어 있으나 게임 데이터는 별도로 필요함
  • VM 실행은 SPI 메모리에서 명령어와 피연산자를 가져오고, 지연 시간을 줄이기 위해 64바이트를 작은 BRAM 캐시에 먼저 읽는 방식임
  • 그래픽 경로는 4개 프레임버퍼, double buffering, vblank 구간 접근 제한, blitter와 rasterizer의 프레임버퍼 접근 중재를 사용함
  • rasterizer는 Another World의 볼록 폴리곤을 수평 span으로 그리며, 투명 효과를 위해 기존 픽셀 값을 읽고 수정하거나 다른 소스 프레임버퍼에서 픽셀을 복사할 수 있음
  • 텍스트 렌더링과 일부 part 6 배경은 남은 LUT 예산 때문에 ROM에 미리 렌더링한 픽셀 버퍼를 저장하고 op_drawString 경로로 복사하는 방식으로 처리함
  • 명시된 제한과 남은 작업은 사운드·음악 부재, part별 별도 bitstream과 데이터 팩 필요, 전체 게임 플레이 검증 미완료, 원작보다 빠른 타이밍 조정, part 연결 방식 탐색임
  • 라이선스는 Silice 설계 MIT License, 문서 CC BY-NC-SA 4.0, 수정된 C++ 포트는 기존 GPL 유지, 게임 데이터는 저작권 대상임

댓글과 토론

Hacker News 의견들
  • 어릴 때 Sega Genesis로 Out of this World를 하면서 그래픽이 이보다 더 좋아질 수는 없다고 생각했음
    Sega에서 그런 완전 애니메이션 컷신은 처음 봤고 정말 대단했음. 당연히 그래픽은 더 좋아졌지만, Another World는 지금도 예술적으로 충분히 버틴다고 느낌. 스타일이 뚜렷하고, 1년쯤 전에 다시 해봤을 때도 여전히 인상적이었음
    퍼즐 상당수는 시행착오에 가깝고 게임도 극도로 짧지만, 그래도 바꾸고 싶은 건 없음. Another World 팬이라면 Flashback: The Quest for Identity도 추천함. 비슷한 영화적 분위기가 있고, 처음엔 별로였지만 지난 10년 사이 점점 좋아졌음
    • Flashback을 정말 좋아함. 사이버펑크 배경이 취향에 맞고, 배경도 아름다우며 이야기도 멋짐
      그래도 Another World는 예술 작품임. 게임 포스터가 유화처럼 보이는데 정말 아름다움 [1]
      [1] http://www.anotherworld.fr/download/AnotherWorld_Poster.jpg
    • Flashback이 너무 좋아서 전문가 난이도로 끝까지 깨보려 했지만, 후반부쯤에서 막혔고 slime man을 못 이겼음
    • Genesis판은 꽤 늦게 나온 편임. 1991년에 출시 직후 Amiga판을 했는데 완전히 충격적이었고, 그런 게임은 이전에 본 적이 없었음
    • Sega에서 Flashback을 먼저 접했고 바로 좋아하게 됨. 나중에 Out of this World를 했을 때는 빠져드는 데 시간이 좀 걸렸지만, 둘 다 훌륭한 예술 작품임
    • Flashback은 Delphine Software 작품이고, 탐정 게임 Cruise for a Corpse에서도 일부 같은 폴리곤 기술을 썼음
  • 같이 볼 만한 자료들:
    cyxx의 Amstrad CPC용 Infernal Runner 역공학 및 JavaScript 포트. Another World 제작자의 작품이고 둘 다 가상 머신 구조를 활용함: https://github.com/cyxx/infernal_js
    Norbert Kehrer의 The Virtual Machine Architecture of Infernal Runner 발표. 독일어 발표에 영어 슬라이드가 있음: https://media.ccc.de/v/vcfb20_-146-en-202010111400-_th...
    The Story of Another World on the Amiga | MVG: https://www.youtube.com/watch?v=0iz9PJbs5rE
    Another World의 Nintendo 64 포트: https://github.com/jnmartin84/aw64
    Another World의 PlayStation 1 포트: https://github.com/fgsfdsfgs/rawpsx
  • HDL이 헷갈린다면, 이건 작성자의 커스텀 언어임: https://github.com/sylefeb/Silice/tree/master
    Verilog로 컴파일하는 컴파일러를 제공하고, 그 결과를 기존 설계 흐름에 넣을 수 있음
  • 인트로가 환상적이었음. PC 스피커만 있고 사운드 카드가 없어도 그랬음
    첫 행동부터 헤엄쳐 도망쳐야 하고, 이어서 사자 같은 생물에게서 탈출해야 하는 건 역대 가장 가혹한 게임 경험 중 하나임. 이 게임은 1분만 해도 평생 기억에 남음
    • 몇 분 이상, 길어야 몇 시간 했던 것 같고 진행도 거의 못 했지만, 그 인트로와 첫 탈출은 지금까지도 기억에 새겨져 있음
      당시 기준으로 이 게임의 극적인 카메라 효과는 정말 제목 그대로 다른 세계 같았음
    • 이 게임을 직접 해본 적은 없지만, 비디오 게임 잡지에 딸려온 홍보용 VHS 테이프의 2분짜리 장면만으로도 30년 동안 머릿속에 박혀 있음
      표지 그림도 훌륭함
    • 사자 같은 것에게서 새 친구가 구해준 직후 나오는 게임 속 “대사”도 절대 잊을 수 없음
      konanaka beetzai! motsuubo! /wave
    • 인트로뿐 아니라 게임 전체가 플로피 디스크 한 장에 들어갔다는 것도 충격적이었음
    • 1분쯤 플레이하고 막혔던 기억이 똑같이 있음. 25년 뒤 다시 해서 끝까지 깼고, 반응 속도 장벽만 넘으면 훌륭하고 기억에 남는 게임
  • Another World의 원 개발자가 GDC 회고 발표를 했는데, GDC 발표 중에서도 꽤 좋은 편임:
    https://www.youtube.com/watch?v=JFaOYYSxSEA
    기억하기로는 개발 도구 일부도 보여주는데, 가상 머신 바이트코드에서 애니메이션을 줄 단위로 직접 수정하고 단계 실행하는 방식도 나옴
  • 90년대에 전체 게임용 가상 머신이 얼마나 흔했는지 궁금함. 나보다 오래된 게임인데, 당시 PC에서 가상 머신 계층은 성능 손실이 크지 않았을까?
    • Amiga, x86(DOS), Mac, 그리고 수많은 기종에서 같은 소프트웨어가 돌아가게 하는 게 훨씬 중요했음
      오늘날은 80년대의 폭발적 성장기보다 기종 수가 적음. 지금도 대부분의 “소프트웨어”는 웹 브라우저가 해석하는 JavaScript라고 볼 수 있음. 80년대에도 이식성 문제는 있었고, 오히려 그때는 직접 인터프리터를 만들어야 해서 더 어려웠음
      많은, 어쩌면 대부분의 비디오 게임은 Doom이나 고성능 3D 그래픽 이전에는 가상 머신으로 작성된 것 같음. 콘솔 게임은 성능 때문에 C나 어셈블리였을 가능성이 큼
      당시 “컴퓨터” 게임은 IBM PC가 표준이 되기 전이거나, 적어도 PC가 이기고 Microsoft가 지배하기 전이었음. Amiga, PC-98, IBM PC, Mac 등 무엇이 이길지 모르는 상황에서는 가상 머신을 만드는 게 합리적이었고, SCUMM이 바로 떠오름
    • 그렇긴 해도 이런 특수 목적 가상 머신으로 Elite 같은 걸 만들지는 않았음
      이식성도 중요했지만, Moore의 법칙이 전속력으로 진행되며 플랫폼 수명이 하루살이 같던 당시에는 가상 머신이 압축 효과도 줬음. 완전 컴파일된 바이너리는 디스크나 테이프 공간, RAM을 너무 많이 먹을 수 있었음
      반면 아주 작은 가상 머신은 즉석에서 해석할 맞춤 언어를 만들 수 있었고, 킬로바이트 하나하나를 아껴야 하는 상황에서 공간을 크게 줄였음. print "Hello world!"와 기본 컴파일 바이너리의 크기 차이를 떠올리면 됨. 텍스트 어드벤처가 아무리 빨라도 X KB 안에 안 들어가면 소용없었음
    • 어셈블리 언어 전성기에는 업무용 소프트웨어에서도 가상 머신이 흔했음. 여러 시스템을 대상으로 하는 표준 준수 C 컴파일러가 아직 없거나 매우 비쌌던 시기라, 서로 다른 시스템으로 포팅하기가 쉬워졌음
    • Infocom Z-Machine, Wizardry의 해석형 Pascal 코드, SCUMM, Sierra AGI와 SCI, Another World, Horrorsoft 게임 등 초기 가상 머신의 요령은, 만들던 게임이 주로 “콘텐츠 전달 장치”라는 점을 잘 파악했다는 데 있음
      텍스트와 그래픽 자산이 많고 계산은 비교적 단순했음. 저작상의 제약은 하드웨어와는 입출력 및 데이터 압축 측면에서만 연결됐고, 인터프리터가 실행하는 코드는 대개 한 번 실행되는 “장면 초기화”와 약간의 애니메이션 타이머였음
      반대쪽 아이디어는 아케이드 게임, 그리고 이후 Doom과 Quake 같은 것에 더 잘 드러남. 게임이 시뮬레이션하는 내용이 하드웨어와 훨씬 밀접하고, 장면 정의는 “여기에 몬스터를 놓고 저기에 체력 아이템을 놓는다” 정도라 스크립트 논리보다는 지도 데이터에 가까워짐
    • “전체 게임 가상 머신”을 어떻게 보느냐에 따라 다름. Infocom의 어드벤처 게임은 모든 게임 코드를 가상 머신에서 돌렸고, Sierra와 LucasArts의 그래픽 어드벤처도 그랬음
      물론 뒤의 둘은 일부 네이티브 그래픽 원시 연산을 사용했음
  • Only Amiga makes it possible이 30년 뒤 FPGA로 대체되는 느낌임
  • “[투명도]는 래스터라이저에 복잡성을 더한다. [색상 값의] 한 비트만 뒤집으려면 해당 위치의 픽셀 이전 값을 알아야 한다”는 부분은 Amiga 같은 평면 그래픽을 쓸 때 얻는 세 가지 장점 중 하나에 가까움
    비트플레인을 쓰면 비디오 메모리를 다시 읽을 필요가 없음. 최상위 비트는 투명 효과 전용이라고 가정하고 스팬을 그대로 뿌리면 됨
    나머지 두 장점은 평면들을 서로 상대적으로 움직여 멋진 무아레 효과를 만들 수 있다는 것, 그리고 8색(픽셀당 3비트)이나 32색(픽셀당 5비트)처럼 바이트나 니블에 딱 맞지 않는 애매한 색상 깊이에서 메모리와 버스 대역폭 효율이 좋다는 것임
  • 이 스레드 덕분에 결국 이 게임을 스스로 풀 일은 없겠다고 인정하고 YouTube에서 플레이 영상을 봤음. 22분짜리였음. 나는 사자를 한 번 지나간 게 전부였던 것 같음