- doom-htop은
htop의 프로세스 목록을 그래픽 출력처럼 사용해 Doom 계열 게임 화면을 ASCII 형태로 보여주는 실험적 프로젝트임
- 실행에는 WAD 게임 데이터 파일이 필요하며, 저장소에는 freedoom1.wad가 포함되어 있고 classic shareware
DOOM1.wad는 별도 다운로드 대상으로 안내됨
- 동작 방식은 Doom 프로세스가 화면 줄 수만큼 자식 프로세스를 만들고, 각 프로세스가 공유 메모리에서 받은 한 줄을 자신의 argv[0] 에 써서
htop의 프로세스 이름 영역에 프레임을 구성하는 방식임
htop은 프로세스 이름을 매번 갱신하도록 설정해야 하며, -d 1로 약 10 FPS 새로고침을 목표로 하고 -s M_VIRT로 가상 메모리 기준 정렬을 사용함
- 키보드 입력은 키보드 장치를 여는 간단한 keylogger 방식이라
sudo가 필요할 수 있고, Ubuntu 22.04에서만 테스트되어 WSL과 Arch는 장치 경로 조정이 필요함
프로젝트 목적과 실행 형태
- doom-htop은
htop이 고전 비디오게임 그래픽을 렌더링하는 데 쓰일 수 있는지 확인하기 위해 만든 프로젝트임
- 결과 화면은 Doom을
htop의 프로세스 목록 위에 ASCII 영상처럼 표시하는 형태임
- 프로젝트는 ozkl/doomgeneric을 포크했으며, Doom 실행 관련 무거운 작업은 해당 프로젝트가 담당함
빌드와 필요한 게임 데이터
- 빌드는
doomgeneric 디렉터리에서 make -j8로 수행함
cd doomgeneric
make -j8
- 실행하려면 WAD 게임 데이터 파일이 필요함
- 저장소에는
freedoom1.wad가 포함되어 있으며, 크레딧은 The Freedoom project에 있음
- classic free shareware 버전
DOOM1.wad는 Doom Wiki에서 받을 수 있음
DOOM1.wad는 GitHub에 올려도 법적으로 괜찮은지 확신하지 못해 포함하지 않았음
실행 방법과 htop 설정
- 실행 전 중요한 작업을 저장하라는 안내가 있으며, 테스트 환경은 12년 된 Lenovo ThinkPad T430s, 8GB RAM, Intel Core i7-3520M @ 2.90GHz, Ubuntu 22.04였고 정상 동작함
- 기본 실행 명령은 다음과 같음
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-htop과 htop 중 어느 것을 먼저 실행해도 상관없음
sudo는 키보드 장치를 열기 위해서만 필요함
sudo 없이 실행하면 입력은 어렵지만 화면은 볼 수 있음
htop -d 1은 10 FPS 새로고침을 노린 설정임
htop -s M_VIRT는 가상 메모리 할당량 기준으로 프로세스를 정렬해 관련 프로세스가 보기 좋게 묶이도록 하기 위한 설정임
- 정렬이 잘 맞지 않으면
main.c의 PROCS_MALLOC_SIZE 값을 조정할 수 있음
sed 명령은 htop이 기본적으로 프로세스 이름을 매번 갱신하지 않기 때문에 필요함
내부 동작 방식
- 저장소는 기존
doomgeneric에 주로 세 파일을 추가함
main.c
keylogger.c
ascii_stuff.c
ascii_stuff.c에는 단순 이미지-to-ASCII 변환기가 생성한 긴 if 문이 들어 있음
- 메인 Doom 프로세스는 ASCII 변환 이미지의 줄 수만큼 프로세스를
fork로 생성함
- 메인 프로세스는 각 자식 프로세스와 공유 메모리 세그먼트를 만들고, 이미지의 각 줄을 대응하는 프로세스의 메모리 세그먼트에 복사함
- 각 자식 프로세스는 자신의 세그먼트에서 내용을 복사해
argv[0]을 덮어씀
htop은 프로세스 이름으로 표시되는 argv[0] 값을 갱신하면서 화면의 한 줄씩을 보여주게 됨
정렬 아이디어와 입력 처리
- 초기 아이디어는 CPU 사용량 기준 정렬이었고, 특정 CPU 사용률을 소비하는 프로세스를 만들려 했지만 구현이 어려웠음
- Linux의
nice 값도 고려했지만 일반 사용자에게 가능한 값이 19개뿐이라 더 나은 그래픽에는 부족하다고 판단함
- 최종적으로 가상 메모리 할당량을 사용했으며, 프로세스별로 꽤 구체적으로 조정할 수 있다고 봄
- 모든 fork 프로세스가 같은 양의 메모리를 할당해도 테스트 시스템에서는
htop이 프레임을 올바른 순서로 보여줌
- 동률일 때 생성 시간 기준으로 정렬되는 것일 수 있다고 추정함
- 다만 다른 시스템에서 어떻게 동작할지 확신하지 못해 같은 값에 의존하지 않음
- 키 입력은 키보드 장치를 여는 간단한 keylogger로 처리함
- 이 방식 덕분에
htop이 열려 있지 않아도 게임은 백그라운드에서 계속 실행됨
플랫폼과 문제 해결
- 테스트는 Ubuntu 22.04에서만 수행됨
- WSL과 Arch에서는 키보드 장치 이름이 다르며, 이식이 필요함
- 키보드가 동작하지 않으면
main.c의 #define KEYBOARD_DEVICE 값을 확인해야 함
/dev/input/by-path에서 kbd가 들어간 항목을 찾아 선택하는 방법이 안내됨
- 프레임이 멈춰 있으면
sed 명령이 적용되지 않았을 수 있음
htop에서 F2 → “Display options” → “Update process names on every refresh”를 체크해 수동으로 설정할 수 있음
~/.config/htop/htoprc가 없다는 오류는 htop을 한 번도 실행하지 않았을 때 발생할 수 있음
htop을 실행했다가 종료한 뒤 sed 명령을 다시 실행하면 됨
- 메인 Doom 프로세스가 크래시해 좀비 프로세스가 많이 남으면 다음 명령으로 정리함
sudo pkill doom-htop
남은 작업과 라이선스
htop은 방향키로 이동할 때 화면을 움직여 게임 조작 중 불편할 수 있음
- 게임 시작 후
a를 눌러 프로세서 선택 메뉴로 포커스를 바꾸는 단순한 우회책이 제안됨
- 제작 이유는 funny였음
- Freedoom은 메인 디렉터리의
freedoom-license.txt에 있는 BSD 유사 라이선스로 배포됨
- 나머지 코드는 GPL로 보인다고 안내됨