한국정보기술진흥원
한국정보기술신문
thumbnail

정보기술 ·

PCB 트레이스로 둠 게임 구현한 'KiDoom' 공개

발행일
읽는 시간3분 22초

전자회로 설계 소프트웨어 KiCad를 활용해 고전 FPS 게임 둠을 PCB 트레이스와 부품 풋프린트로 렌더링하는 기술 시연 프로젝트가 공개됐다.

[한국정보기술신문] 전자회로 기판(PCB) 설계 도구를 게임 렌더링 엔진으로 활용하는 독창적인 프로젝트가 기술 커뮤니티의 주목을 받고 있다. 엔지니어 마이클 에일스가 개발한 'KiDoom'은 1993년 출시된 전설적인 1인칭 슈팅 게임 둠(DOOM)을 PCB 설계 소프트웨어 KiCad 상에서 실제 구리 트레이스와 전자부품 풋프린트를 이용해 렌더링하는 기술 시연 프로젝트다.

이 프로젝트는 단순한 개념 증명을 넘어 초당 10~25프레임으로 실제 플레이가 가능한 수준의 성능을 달성했다. 게임 내 벽면은 파란색 구리 트레이스로, 적 캐릭터는 64핀 QFP 칩 패키지로, 체력 팩은 SOT-23 트랜지스터로 표현되는 등 전자부품의 복잡도가 게임플레이 상의 중요도를 직관적으로 반영하도록 설계됐다.

픽셀 방식의 한계 극복한 벡터 렌더링

kidoom-demo-new.gif
mikeayles.com 제공

프로젝트 초기 기획 단계에서는 PCB 패드를 이용한 픽셀 단위 렌더링이 검토됐다. 그러나 320x200 해상도 기준 64,000개의 픽셀을 렌더링할 경우 프레임당 6.4초가 소요돼 초당 0.15프레임이라는 실용성 없는 결과가 예상됐다.

이를 해결하기 위해 에일스는 둠 엔진이 내부적으로 가시 기하구조를 벡터로 계산한다는 점에 착안했다. PCB 트레이스 역시 벡터 요소라는 점을 활용해 프레임당 100~300개의 선분만으로 렌더링하는 방식으로 전환했다. 이를 통해 프레임당 렌더링 시간을 40~60밀리초로 단축하며 초당 10~25프레임의 플레이 가능한 성능을 확보했다.

구체적으로 약 200개의 트레이스를 각각 0.1밀리초에 처리하면 20밀리초가 소요되고, 여기에 화면 갱신 오버헤드를 더해 총 40~60밀리초가 소요되는 구조다. 이는 픽셀 방식 대비 200~500배 향상된 성능이다.

3중 렌더링 모드와 소켓 기반 아키텍처

final_wireframe_renderer_example_1.png
mikeayles.com 제공

KiDoom은 SDL 윈도우, 파이썬 와이어프레임 렌더러, KiCad PCB 에디터라는 세 가지 병렬 시각화 모드를 동시에 제공한다. SDL 윈도우는 실제 게임플레이를 위한 전체 그래픽을 표시하고, 파이썬 와이어프레임은 추출된 벡터를 녹색 벽 외곽선과 노란색 개체 박스로 보여주는 디버깅 도구 역할을 한다. KiCad PCB는 파란색 구리 트레이스로 와이어프레임 벽을 구현하고 실제 풋프린트로 개체 위치를 표시하는 메인 데모 화면이다.

시스템 아키텍처는 C 언어로 작성된 둠 엔진에서 벡터를 추출하고 유닉스 소켓을 통해 JSON 형식으로 직렬화해 파이썬으로 전송하는 구조다. 파이썬은 메인 스레드에서 데이터를 수신 및 파싱한 후 PCB 요소를 업데이트하며, 이는 macOS에서 wx 객체의 스레드 안전성 문제를 해결하기 위한 설계다.

게임 개체를 전자부품으로 매핑한 독창적 시스템

프로젝트의 가장 혁신적인 부분은 게임 내 개체를 실제 PCB 풋프린트로 렌더링하되, 부품의 복잡도가 게임플레이 상의 중요도와 일치하도록 설계한 점이다. 수집 아이템인 체력 팩, 탄약, 열쇠카드는 3핀 SOT-23 패키지로 표현되고, 장식용 요소인 배럴, 시체, 횃불은 8핀 SOIC-8 패키지로, 좀비와 악마 등 적 캐릭터와 플레이어는 64핀 QFP 패키지로 구현된다.

이를 위해 에일스는 둠의 소스 코드를 패치했다. 원래 둠의 vissprite_t 구조체는 개체 타입에 대한 직접 포인터를 포함하지 않았으나, 구조체에 mobjtype 필드를 추가하고 R_ProjectSprite 함수에서 스프라이트 생성 시점에 개체 타입을 캡처하도록 수정했다. 파이썬 측에서는 150개 이상의 개체 타입을 세 가지 카테고리로 매핑하는 시스템을 구축했다.

기술적 난제 해결 과정

개발 과정에서 여러 기술적 도전과제가 발생했다. 소켓 타이밍 문제의 경우 둠이 파이썬보다 빠르게 실행돼 연결 거부 오류가 발생했는데, 이를 2단계 소켓 설정 방식으로 해결했다. 먼저 소켓을 생성한 후 둠 프로세스를 실행하고 연결을 대기하는 순서로 변경한 것이다.

macOS에서의 스레드 안전성 문제도 있었다. 백그라운드 스레드에서 PCB 객체를 수정하면 KiCad가 충돌하는 현상이 발생해, 모니터링 스레드에서는 프로세스와 소켓 같은 스레드 안전 객체만 정리하고 wx 객체는 KiCad의 정상 종료 과정에서 처리하도록 수정했다.

좌표 시스템 혼란도 초기 렌더링이 상하 반전되는 문제를 야기했다. KiCad의 Y축에 대한 잘못된 가정이 원인이었으나, 둠과 KiCad 모두 Y좌표가 아래로 증가하는 동일한 시스템을 사용한다는 점을 파악해 해결했다.

성능 최적화와 실용성

M1 맥북 프로에서 초당 15~25프레임, i7 CPU와 RTX 3050 Ti GPU 조합에서 18~28프레임의 성능을 보였다. 병목 구간은 KiCad의 pcbnew.Refresh 호출이며, 나머지 요소들은 수 밀리초 내에 처리된다.

성능 최적화를 위해서는 KiCad 설정에서 그리드 표시, 랫스네스트, 안티앨리어싱, 클리어런스 아웃라인 등을 비활성화해야 한다. 이러한 설정 없이는 성능이 2~5배 저하된다.

시각적으로는 현대적인 둠보다는 1982년 벡터 아케이드 게임인 배틀존이나 엘리트에 가까운 미학을 보여준다. 벽은 와이어프레임 박스로 표현되고, 트레이스 두께가 거리를 나타내는 깊이 큐잉 기법이 적용됐다.

오픈소스 공개 및 파생 프로젝트

에일스는 KiDoom을 오픈소스로 공개해 누구나 시도할 수 있도록 했다. 저장소를 복제한 후 둠을 빌드하고 독립형 렌더러를 먼저 테스트한 다음 KiCad 플러그인으로 설치하는 과정을 거치면 된다.

이 프로젝트의 벡터 렌더링 접근 방식은 오실로스코프에서 둠을 렌더링하는 ScopeDoom 등 파생 프로젝트에도 영감을 제공했다. 동일한 벡터 추출 파이프라인을 활용하되 오실로스코프 디스플레이에 게임을 그리는 오디오 신호를 출력하는 방식이다.

PCB 에디터에서도 둠을 실행할 수 있다는 이 프로젝트는 실용성과는 거리가 멀지만, 소프트웨어 도구의 창의적 활용 가능성을 보여주는 기술 시연으로서 의미를 갖는다. 에일스는 프로젝트를 통해 PCB 에디터가 충분히 창의적으로 접근하면 튜링 완전하다는 점을 증명했다고 밝혔다.

한국정보기술신문 정보기술분과 유상헌 기자 news@kitpa.org