2P by neo 2달전 | favorite | 댓글 1개

DOOM을 htop으로 구현하기

빌드 방법

  • doomgeneric 디렉토리로 이동
  • make -j8 명령어로 빌드
  • WAD 파일(게임 데이터)이 필요함. 이 프로젝트에는 freedoom1.wad가 포함되어 있음(Freedoom 프로젝트에 모든 크레딧). 또는 고전 무료 쉐어웨어 버전 DOOM1.wad를 다운로드해서 사용 가능

실행 방법

  • 중요한 작업은 미리 저장 권장
  • 오래된 노트북에서도 잘 동작함을 확인
  • 아래 명령어 실행:
    sed -i 's/update_process_names=0/update_process_names=1/' ~/.config/htop/htoprc
    sudo ./doom-htop -iwad freedoom1.wad
    htop -d 1 -s M_VIRT
    
  • doom-htophtop 실행 순서는 상관없음
  • 키보드 디바이스를 열기 위해 sudo 필요. 안전상 우려된다면 sudo 없이 실행해서 그래픽만 감상 가능
  • htop-d 1은 10FPS 갱신 속도를 위한 것. -s M_VIRT는 가상 메모리 할당 순으로 프로세스를 정렬하기 위함
  • sed 명령어는 htop이 기본적으로 프로세스 이름을 매번 갱신하지 않기 때문에 필요

동작 원리

  • https://github.com/ozkl/doomgeneric 프로젝트를 포크해서 작업
  • main.c, keylogger.c, ascii_stuff.c 파일 추가 및 일부 수정
  • 간단한 이미지-ASCII 변환기 작성 (ascii_stuff.c의 긴 if문)
  • 메인 doom 프로세스가 ASCII 이미지의 줄 수만큼 자식 프로세스를 생성하고, 각 프로세스와 공유 메모리 세그먼트 생성
  • 메인 프로세스는 각 줄을 해당 프로세스의 메모리 세그먼트에 복사하고, 각 자식 프로세스는 자신의 세그먼트에서 읽어서 argv[0]을 덮어씀
  • 원래는 CPU 사용량으로 프로세스를 정렬하려 했으나 어려움. 리눅스의 nice도 고려했으나 사용자가 설정 가능한 값이 19개뿐이라 포기
  • 가상 메모리 할당량을 사용하는 아이디어를 떠올림. 프로세스마다 특정함
  • 모든 자식 프로세스가 정확히 같은 메모리를 할당해도 htop에서 올바른 순서로 프레임이 표시됨. 아마도 동일한 경우 생성 시간 순으로 정렬되는 것으로 추측
  • 키보드 디바이스를 여는 간단한 키로거 작성. htop 실행 여부와 상관없이 백그라운드에서 게임이 항상 실행됨

지원 플랫폼

  • Ubuntu 22.04에서만 테스트함
  • WSL과 Arch에서는 키보드 디바이스 이름이 다름. 포팅 필요

문제 해결

  1. 키보드가 작동하지 않는 경우
    • main.cKEYBOARD_DEVICE 매크로 확인. 플랫폼마다 다를 수 있음
    • ll /dev/input/by-path 명령어로 kbd가 포함된 디바이스 선택
  2. 프레임이 멈춘 경우
    • sed 명령어가 작동하지 않았을 수 있음
    • htop에서 F2 -> "Display options" -> "Update process names on every refresh" 체크
  3. sed: can't read /home/<user>/.config/htop/htoprc: No such file or directory 오류
    • htop을 한 번도 실행하지 않아서 발생. htop 실행 후 종료하고 sed 다시 실행
  4. 메인 doom 프로세스가 죽고 좀비 프로세스만 남은 경우
    • sudo pkill doom-htop 실행

개선 사항

  • 방향키로 이동할 때 htop 화면이 움직여서 불편함
  • htop 시작 후 포커스를 변경하는 것으로 해결 가능 (예: a 키 눌러서 프로세서 선택 메뉴 열기)

FAQ

  1. Q: 왜 만들었나요? A: 재미있을 것 같아서요.

라이선스

  • Freedoom은 BSD 스타일 라이선스 (freedoom-license.txt 참조)
  • 나머지 코드는 GPL로 추정

GN⁺의 의견

  • ASCII 아트로 3D 게임 화면을 표현하는 것은 신선한 아이디어. C로 htop처럼 화면에 그래픽을 그리는 좋은 예제가 될 것 같음
  • 단순히 화면만 ASCII 아트로 바꾸는게 아니라 실제 게임 엔진과 연동해서 구현했다는 점이 인상적
  • 기존 doomgeneric 프로젝트를 잘 활용해서 적은 양의 코드로 구현한 점도 높이 평가할만함
  • 키보드 입력을 받기 위해 리눅스 디바이스를 직접 여는 것은 WSL이나 다른 OS 환경에서 동작하지 않을 수 있음. OS에 독립적인 키 입력 라이브러리 사용을 검토해볼만함
  • 공유 메모리를 사용해서 부모-자식 프로세스간 ASCII 프레임 데이터를 주고 받는 아이디어가 흥미로움. IPC에 대해 공부하기 좋은 예제
  • ASCII 그래픽을 htop의 프로세스 이름에 넣는 아이디어도 창의적. 하지만 htop이 프로세스 이름 변경에 의해 화면이 움직이는 등 부작용도 있음. 개선이 필요해보임
  • GPL 라이선스인 것으로 추정되나 명확하지 않음. 코드 재사용시 라이선스 확인 필요
Hacker News 의견

이 댓글들은 htop을 이용해서 ASCII로 렌더링된 Doom 게임을 프로세스로 실행하는 프로젝트에 대한 반응을 담고 있음. 주요 내용은 다음과 같음:

  • PSDoom과의 비교: PSDoom이 Doom을 이용해 프로세스 관리를 하는 반면, 이 프로젝트는 그 반대로 프로세스 매니저를 이용해 Doom을 플레이하는 것임.
  • 기술적 평가: ASCII로 렌더링해서 프로세스 이름에 넣는 것 자체는 어렵지 않지만, htop을 렌더링 엔진으로 활용한 발상이 인상적이고 소프트웨어 해킹의 정수를 보여줌.
  • 개발자의 능력에 대한 존경: 이런 프로젝트를 만들 시간과 능력이 있는 개발자들을 보면 자신의 능력에 자신감을 잃게 됨.
  • Doom 통합 트렌드: 이제는 Doom에 일상적인 것들을 통합하는 것도 고려해볼 만함. 할 일 목록이나 캘린더 등을 상상해볼 수 있음.
  • 해커 정신 찬양: 재미를 위한 해킹 프로젝트가 인기를 얻는 것을 보니 기쁘고, 해커 정신이 아직 살아있음을 보여줌.
  • Bad Apple 연상: Windows 작업 관리자에서 구현된 Bad Apple 영상을 연상시킴.
  • Doom의 미래: 앞으로 Doom이 어디까지 구현될 수 있을지 상상하기 어려움.