Doom
Guide to Doom
둠 웹GL 엔진 아키텍처 심층 분석: 브라우저 렌더링 파이프라인 완전 해부
클래식 둠이 현대 브라우저에서 구동되는 원리를 이해하는 것은 단순한 호기심이 아니다. 1993년 id Software가 선보인 이 전설적인 FPS는 오늘날 WebGL과 JavaScript 에뮬레이션을 통해 둠 언블록 형태로 전 세계 게이머들에게 개방되어 있다. 원본 386 프로세서 최적화 코드가 어떻게 GPU 가속 렌더링으로 변환되는지, 그 기술적 깊이를 파헤쳐보자.
웹 기반 둠 에뮬레이터들은 대부분 ASM.js 또는 WebAssembly 포팅을 통해 작동한다. 원본 C 코드를 Emscripten 툴체인으로 컴파일하여 브라우저 호환 바이너리를 생성하는 방식이다. 이 과정에서 렌더러는 소프트웨어 래스터라이제이션에서 하드웨어 가속 3D로 전환되며, 텍스처 아틀라스와 쉐이더 프로그램이 핵심 역할을 수행한다.
WebGL 쉐이더 구조와 BSP 트리 렌더링
둠의 혁신적인 BSP(Binary Space Partitioning) 트리 알고리즘은 WebGL 환경에서 완전히 새로운 해석을 거쳤다. 원본 엔진은 CPU에서 서브섹터를 정렬하여 오버드로를 최소화했지만, 현대 WebGL 포팅은 GPU에서 깊이 버퍼링을 활용한다. 정점 쉐이더는 각 서브섹터의 바닥과 천장 평면을 3D 공간 좌표로 변환하고, 프래그먼트 쉐이더는 텍스처 매핑과 라이팅을 처리한다.
- BSP 트리 순회: 원본 P_CompleteLevel 로직이 JavaScript 배열로 재구현되어 O(n log n) 정렬 유지
- 서브섹터 분할: 각 섹터가 독립적인 드로우 콜로 처리되어 상태 변경 최소화
- 텍스처 아틀라스: 모든 스프라이트와 월 텍스처를 단일 4096x4096 텍스처에 패킹
- UV 좌표 계산: 원본 8.8 고정소수점 포맷이 float32 정밀도로 업스케일
둠 언블록 66이나 둠 언블록 76에서 경험하는 시각적 디테일은 사실 쉐이더 내의 픽셀 쉐이딩 로직에 기반한다. 원본 게임은 팔레트 기반 컬러 인덱싱을 사용했지만, WebGL 포팅은 RGB 값으로 직접 변환하여 PLAYPAL의 256색을 sRGB 공간에 매핑한다. 이 과정에서 컬러 밴딩 현상이 발생할 수 있으나, 디더링 알고리즘이 이를 완화한다.
텍스처 스트리밍과 메모리 관리
둠의 WAD 파일 구조는 압축되지 않은 리소스 컨테이너로, 에뮬레이터는 전체 WAD를 메모리에 로드할 필요가 없다. 지연 로딩 전략이 적용되어, 플레이어가 새로운 맵에 진입할 때만 해당 리소스를 XMLHttpRequest 또는 Fetch API로 가져온다. 이는 둠 언블록 911과 같은 프록시 사이트에서 대역폭 최적화에 필수적이다.
GPU 메모리 관리 측면에서는 텍스처 해제 타이밍이 중요하다. WebGL 1.0은 가비지 컬렉션이 자동이 아니지만, WebGL 2.0 컨텍스트에서는 SAMPLER_2D 유니폼이 자동 관리된다. 고급 에뮬레이터들은 텍스처 참조 카운팅을 구현하여, 마지막 에피소드 클리어 후 이전 맵 텍스처를 점진적 해제한다.
물리 엔진 내부 로직: 충돌 감지와 이동 처리 완전 분해
둠의 물리 시스템은 현대 게임과 달리 레이캐스팅 기반 충돌 감지를 사용한다. 이는 3D 공간 연산이 아닌 2D 평면에서의 수학적 투영으로 구현된다. 이해하지 못하면 둠 치트를 써도 속도런을 할 수 없다. 각 이동 프레임마다 플레이어 위치에서 8개 방향으로 레이를 발사하여 벽 충돌을 감지하는 방식이다.
충돌 감지 알고리즘 상세
P_TryMove 함수는 모든 이동 연산의 핵심이다. 플레이어가 전진하려 할 때, 엔진은 새로운 좌표가 유효한지 확인하기 위해 다음 연산을 수행한다:
- 블록맵 조회: 128x128 유닛 격자에서 해당 좌표의 블록을 O(1)로 검색
- 라인 세그먼트 테스트: 블록 내 모든 라인에 대해 교차 판정 수행
- 슬라이딩 계산: 충돌 시 벽을 따라 미끄러지는 벡터 재계산
- 높이 검증: 서브섹터의 바닥/천장 높이가 플레이어 충돌권보다 높은지 확인
이 모든 연산이 35Hz 틱 레이트로 수행된다. 60fps 디스플레이에서는 프레임 보간이 필요한데, 둠 언블록 WTF 에서는 프레임 스테이킹 기법으로 입력 지연을 최소화한다.
적 AI와 경로 탐색의 비밀
둠의 적 AI는 A* 알고리즘이 아닌 노드 기반 그리드를 사용한다. 각 몬스터는 자신의 현재 서브섹터에서 인접 서브섹터로의 경로를 매 틱마다 재계산한다. 이를 이해하면 아주 정밀한 적 스폿팅이 가능하다.
사운드 전파 시스템은 몬스터의 어그로를 결정한다. 무기 발사음은 서브섹터 연결성을 따라 전파되며, 닫힌 문은 소음을 차단한다. 이 메커니즘을 이용하면 스텔스 플레이가 가능하다. 펀치 킬은 소음 레벨이 0이므로 주변 적이 반응하지 않는다.
지연 시간 최적화: 입력부터 화면까지 완벽 가이드
온라인 브라우저 환경에서 둠 언블록을 플레이할 때 가장 큰 적은 입력 지연이다. 원본 도스 시절에는 35ms 고정 틱이 있었지만, 브라우저에서는 requestAnimationFrame과 이벤트 루프가 개입된다. 이를 최적화하는 방법을 공개한다.
입력 파이프라인 분석
키보드 입력부터 화면 반영까지의 경로는 다음과 같다:
- keydown 이벤트: 브라우저가 운영체제 인터럽트를 JavaScript 이벤트로 변환 (약 2-8ms)
- 입력 버퍼링: 에뮬레이터가 이벤트를 큐에 저장하고 다음 틱에 처리
- 게임 로직 업데이트: P_PlayerThink 함수가 이동/발사 명령 처리
- 렌더링: WebGL 드로우 콜이 GPU 명령 큐에 전송
- 버퍼 스왑: VSync 동기화로 화면 출력 (모니터 주사율에 따라 16.67ms~)
총 입력 지연은 이론적으로 50-80ms에 달한다. 하지만 입력 예측 기법으로 체감 지연을 16ms 수준으로 단축할 수 있다. 프레임 시작 시점에 입력 상태를 미리 폴링하고, 다음 틱까지 기다리지 않고 즉시 처리하는 방식이다.
프레임 타이밍 정밀 조정
에뮬레이터들은 주로 다음 타이밍 전략을 사용한다:
- 동기 모드: 35fps로 고정, 입력 드롭 발생 가능
- 비동기 모드: 60fps+ 렌더링, 게임 로직은 35Hz 유지
- 적응형 모드: 모니터 주사율에 맞춰 틱 레이트 동적 조절
둠 프라이빗 서버 환경에서는 네트워크 지연이 추가된다. 클라이언트 사이드 예측과 서버 사이드 조정을 조합하여, 100ms 핑에서도 싱글플레이와 유사한 경험을 제공한다. 체력 동기화는 서버 권한이지만, 이동은 즉시 로컬에서 처리된다.
브라우저 호환성 완전 스펙: 크롬부터 엣지까지
각 브라우저별 WebGL 구현 차이는 둠 언블록 76 실행에 직접적 영향을 미친다. 2024년 기준 주요 브라우저별 성능 특성을 분석한다.
크롬/엣지 Chromium 엔진
V8 JavaScript 엔진의 JIT 컴파일레이션은 WebAssembly 코드를 네이티브 수준으로 최적화한다. 스트리밍 컴파일 기능은 WAD 파일 다운로드와 동시에 컴파일을 진행하여 초기 로딩 시간을 50% 단축한다. WebGL 2.0 컨텍스트는 ANGLE 라이브러리를 통해 DirectX 백엔드로 변환되어 윈도우에서 최고 성능을 발휘한다.
파이어폭스 Gecko 엔진
모질라의 WebRender 아키텍처는 GPU 렌더링 파이프라인을 더 깊이 활용한다. 텍스처 업로드가 별도 스레드에서 처리되어 드로우 콜 병목이 감소한다. 다만 asm.js 경로에서는 크롬보다 약간 느린 편이다.
사파리 WebKit 엔진
iOS 및 macOS 사파리는 WebGL 2.0 지연으로 인해 둠 언블록 66 실행에 제약이 있다. Metal 백엔드 사용 시 텍스처 포맷 제한이 있어, 일부 커스텀 WAD의 하이컬러 텍스처가 깨질 수 있다. iOS 17 이상에서는 JIT 컴파일 제한이 완화되어 성능이 개선되었다.
저사양 하드웨어 최적화: 포텀이나 랩탑에서도 60프레임
모든 게이머가 RTX 4090을 가진 것은 아니다. 통합 그래픽이나 구형 하드웨어에서 둠 언블록을 원활하게 구동하는 방법을 정리한다.
해상도 스케일링
원본 둠은 320x200 해상도로 렌더링된다. 현대 모니터에서 이를 확대하면 픽셀이 뭉개지는데, 이를 역이용한다. 동적 해상도 조절은 프레임 드롭 시 렌더 해상도를 50%로 낮추고 업스케일링한다. 브라우저에서는 canvas CSS 크기를 유지하면서 내부 해상도만 낮추는 방식으로 구현된다.
텍스처 품질 설정
저사양 GPU는 텍스처 샘플링이 병목이다. 이를 완화하는 방법:
- 밉맵 비활성화: 거리에 따른 텍스처 LOD를 끄면 메모리 대역폭 절약
- 필터링 모드: 바이리니어에서 최근접 이웃으로 변경하여 텍스처 룩업 연산 감소
- 텍스처 압축: S3TC 또는 ETC2 포맷으로 VRAM 사용량 75% 감소
CPU 병목 해결
JavaScript 메인 스레드가 병목인 경우, Web Worker로 게임 로직을 분리한다. 렌더링은 메인 스레드, 게임 틱은 워커 스레드에서 처리하여 멀티코어 활용률을 높인다. 다만 메시지 패싱 오버헤드가 있어, 틱당 데이터는 최소화해야 한다.
프로 레벨 전략: 탑 플레이어만 아는 7가지 프레임 단위 테크닉
이제 진짜다. 아무나 모르는 둠의 숨겨진 메커니즘을 공개한다. 이것을 마스터하면 UV(Ultra-Violence) 나이트메어 런도 가능하다.
프로 팁 1: 라인 스킵 테크닉
둠의 충돌 시스템은 라인 세그먼트 교차 판정을 사용한다. 특정 각도로 벽에 접근하면, 한 틱 내에 충돌 라인을 통과할 수 있다. 이를 라인 스킵이라 한다. 구현 방법은 벽에 45도 각도로 접근하며 전진 키를 누른 상태에서 스트레이프 키를 빠르게 토글하는 것이다. 성공하면 벽 너머로 순간이동한다.
프로 팁 2: 아머 리셋 글리치
그린 아머와 블루 아머는 서로 다른 속성을 가진다. 그린은 100% 보호에 30% 흡수, 블루는 50% 보호에 50% 흡수. 아머 픽업 프레임에 데미지를 입으면 아머 속성이 리셋되어 최대 보호율이 갱신된다. 이를 이용해 1% 아머로도 50% 보호를 유지할 수 있다.
프로 팁 3: 몬스터 인피팅 유도
모든 몬스터는 자신을 공격한 대상에게 어그로가 고정된다. 바론이 임프를 실수로 공격하면 임프는 바론을 공격한다. 이를 인피팅이라 하며, 몬스터가 몰려있는 방 입구에서 로켓을 발사하여 내부 적끼리 싸우게 유도하면 탄약을 절약할 수 있다.
프로 팁 4: 무한 높이 펀치
둠의 근접 공격은 수직 범위가 무제한이다. 적이 플레이어 바로 위나 아래에 있어도 펀치가 명중한다. 계단 아래 적을 펀치로 처리하거나, 높은 플랫폼에서 떨어지며 적을 타격할 수 있다.
프로 팁 5: 라디컬 타이밍 이그니션
임프 파이어볼은 발사 후 약 21 틱이 지나야 데미지 판정이 활성화된다. 이 틱 동안 임프를 죽이면 파이어볼이 소멸한다. BFG의 충격파는 70도 각도 내 모든 적에게 40-800 데미지를 입히는데, 발사 후 16-22 틱 사이에 플레이어 시선을 적 방향으로 돌리면 데미지 트레이스가 재계산된다.
프로 팁 6: 런 스킵 이동
둠의 이동 속도는 전진 + 스트레이프 결합 시 벡터 합이 아닌 최대값을 사용한다. 하지만 런 키(SHIFT)를 토글하며 전진하면 가속도가 중첩된다. 특정 틱에서 런 키를 떼면 관성이 유지되어 일시적 속도 증가가 가능하다. 이를 런 스킵이라 한다.
프로 팁 7: 사이드 디스플레이 플래시
BFG 발사 후 폭발까지 약 25 틱이 소요된다. 이때 플레이어 시선을 180도 회전하면 후방 적도 BFG 데미지를 입는다. 이는 BFG 트레이스가 플레이어가 바라보는 방향을 기준으로 계산되기 때문이다. E4M2 등의 오픈 맵에서 필수 테크닉이다.
WebGL 쉐이더 깊이 분석: 프래그먼트 처리의 모든 것
이 섹션은 프로그래머를 위한 것이다. 둠 WebGL 포팅의 핵심 쉐이더 코드를 분석한다.
정점 쉐이더 구조
둠의 월 렌더링은 사실상 2D이다. 정점 쉐이더는 단순히 화면 좌표로의 투영만 수행한다:
- 모델 매트릭스: 레벨 좌표계에서 카메라 좌표계로 변환
- 프로젝션 매트릭스: 시야각에 따른 원근 투영 (보통 90도)
- 높이 오프셋: 바닥과 천장의 Y 좌표를 플레이어 시선 높이에 맞춤
최적화 기법으로는 인스턴싱이 있다. 동일한 지오메트리를 여러 위치에 렌더링할 때 드로우 콜을 하나로 통합한다. E1M1의 코린도어 같은 반복 구조에서 유용하다.
프래그먼트 쉐이더 디테일
텍스처 매핑은 다음 과정을 거친다:
- UV 좌표 계산: 원본 8.8 고정소수점에서 float32로 변환
- 텍스처 룩업: texture2D() 함수로 텍셀 값 조회
- 컬러 매핑: 컬러맵 인덱스를 실제 RGB로 변환
- 포그 효과: 거리 기반 밝기 감소
원본 둠은 팔레트 인덱스를 사용하므로, WebGL에서는 팔레트 텍스처를 별도로 생성하여 인덱스를 실제 컬러로 변환한다. 이 방식은 텍스처 메모리를 절약하지만, 룩업 횟수가 증가한다. 둠 언블록 911 등의 사이트에서는 사전 변환된 RGB 텍스처를 사용하여 이 오버헤드를 제거한다.
네트워크 멀티플레이: 데스매치 프로토콜 해부
둠 프라이빗 서버는 원본 도스용 IPX 프로토콜을 TCP/IP로 래핑하여 구현된다. 현대 Odamex, Zandronum, ZDaemon 등의 소스포트 프로토콜을 분석한다.
티크 동기화 메커니즘
둠은 결정론적 게임이다. 동일한 입력 시퀀스는 항상 동일한 결과를 생성한다. 이를 이용한 롤백 넷코드가 구현된다:
- 입력 큐: 각 클라이언트가 자신의 입력을 버퍼링
- 프레임 번호: 모든 클라이언트가 동일한 프레임 번호로 동기화
- 상태 스냅샷: 주기적으로 게임 상태를 저장하여 디싱크 복구
- 롤백: 입력 불일치 발견 시 마지막 스냅샷부터 재시뮬레이션
둠 치트를 멀티플레이에서 사용하려면 서버 측 검증을 우회해야 한다. 대부분의 프라이빗 서버는 치트 방지 시스템을 구현하므로, 클라이언트 사이드 조작은 감지된다. 다만 입력 지연 시각화나 HUD 커스터마이징 같은 클라이언트 전용 모드는 허용된다.
대역폭 최적화
둠의 네트워크 트래픽은 의외로 작다. 35 틱당 4플레이어 데스매치 기준:
- 입력 패킷: 플레이어당 8바이트 (4개 버튼 + 이동/회전 값)
- 상태 업데이트: 전체 게임 상태 델타 압축, 평균 500바이트
- 총 대역폭: 56kbps 모뎀으로도 충분
이것이 둠이 1994년 이미 4플레이어 데스매치를 지원할 수 있었던 이유다.
캐시 최적화: 브라우저 저장소 활용 전략
둠 언블록 사이트의 로딩 속도는 브라우저 캐시 활용에 달려 있다. WAD 파일은 수십 메가바이트에 달하므로, 매번 다운로드하면 끔찍한 경험이 된다.
Service Worker 캐싱
현대 브라우저는 Service Worker를 통해 오프라인 플레이를 지원한다. 최초 방문 시 WAD 파일을 Cache Storage에 저장하고, 이후 요청은 네트워크 없이 처리한다. 둠 언블록 76 등의 사이트는 이 기술을 적극 활용한다.
IndexedDB 활용
저장 게임 데이터와 커스텀 WAD는 IndexedDB에 저장된다. 이는 로컬스토리지보다 훨씬 큰 용량을 지원하며, 블롭 데이터 처리에 최적화되어 있다. 세이브 슬롯당 약 100KB가 소요된다.
메모리 캐시 vs 디스크 캐시
브라우저 개발자 도구에서 캐시 히트를 확인할 수 있다:
- 메모리 캐시: 현재 세션에서만 유지, 가장 빠름
- 디스크 캐시: 브라우저 종료 후에도 유지, 약간 느림
- 프리페치: 다음 에피소드 리소스를 미리 다운로드
오디오 엔진: 사운드 시스템 완전 분석
둠의 오디오는 사실 엔진 혁신의 핵심이었다. 1993년 PC 스피커나 사운드 블라스터를 위해 설계된 시스템이 Web Audio API로 어떻게 변환되는지 분석한다.
MIDI 시퀀서
둠의 배경음은 MIDI 형식이다. 원본은 MPU-401 인터페이스로 출력되었지만, 브라우저에서는 Web Audio API Synthesizer로 렌더링된다. 각 악기는 사인파, 톱니파, 삼각파의 조합으로 합성된다.
디지털 사운드 이펙트
무기 발사음, 몬스터 소리는 8-bit 11kHz 샘플이다. Web Audio API에서는 이를 업샘플링하여 44.1kHz로 재생한다. 리샘플링 품질 설정으로 CPU 부하를 조절할 수 있다.
3D 사운드 포지션�
둠은 모노럴 사운드만 지원했지만, 모던 소스포트는 HRTF(Head-Related Transfer Function)으로 3D 오디오를 구현한다. 적의 위치에 따라 소리가 좌우로 패닝되고, 거리에 따라 볼륨이 감쇠한다. 헤드폰 사용 시 방향 감각이 크게 향상된다.
지역별 게이밍 키워드와 검색 최적화 전략
한국 게이머들은 둠 언블록을 다양한 키워드로 검색한다. 지역 특성에 맞는 SEO 전략을 분석한다.
한국 둠 커뮤니티 검색 패턴
네이버와 다음에서의 둠 관련 검색어 분석 결과:
- "둠 언블록": 학교/직장에서 플레이 가능한 버전 검색
- "둠 치트": IDDQD, IDKFA 등 클래식 치트코드 검색
- "둠 프라이빗 서버": 멀티플레이 데스매치 서버 검색
- "둠 언블록 66": 프록시 사이트 중 하나
- "둠 언블록 76": 대안 미러 사이트
- "둠 언블록 911": 긴급 접속용 사이트
- "둠 언블록 WTF": 변종 포털 사이트
이 키워드들은 실제 검색량이 상당하며, Doodax.com에서는 이를 모두 커버하는 콘텐츠를 제공한다.
모던 소스포트 비교: 어떤 엔진을 선택할 것인가
원본 둠이 아닌 모던 소스포트를 선택한다면, 각 엔진의 특성을 이해해야 한다.
GZDoom
가장 대중적인 소스포트. OpenGL 렌더러와 모딩 API를 지원한다. Decorate 스크립트로 무기, 적, 아이템 커스터마이징이 가능하다. 브루탈 둠, 프로젝트 브루탈리티 같은 토탈 컨버전이 이 엔진을 기반으로 한다.
dsda-doom
스피드런 커뮤니티의 표준. 데모 녹화와 프레임 단위 리와인드를 지원한다. UV-MAX, 나이트메어 런 등의 기록은 모두 이 엔진으로 인증된다.
Woof!
초경량 소스포트. 원본 도스 둠에 가장 가까운 경험을 제공한다. 저사양 하드웨어나 둠 언블록 66 같은 제한 환경에서 최적이다.
Crispy Doom
원본 체험을 고집하는 게이머를 위한 엔진. 버그 수정만 최소한으로 적용되어 1993년의 감성을 그대로 유지한다.
속도런 기술: 세계 기록을 위한 프레임 단위 분석
둠 속도런은 밀리초 단위의 싸움이다. 현재 UV-MAX 세계 기록 홀더들의 테크닉을 분석한다.
맵 별 최적 루트
E1M1 "Hangar" 클래식 맵에서:
- 시작: 뒤로 돌아 비밀 방으로 진입 (3초 절약)
- 중앙홀: 임프 스폰 전에 러시, 펀치 킬로 탄약 절약
- 출구: 스위치 대신 라인 스킵으로 바로 출구 트리거
이 루트의 이론적 최적 시간은 8초대. 현재 세계 기록은 9.12초이다.
웨이포인트 시스템
프로 러너들은 웨이포인트를 사용하여 정밀한 이동 경로를 계획한다. 각 포인트는 좌표, 시선 각도, 타이밍을 포함하며, 이를 프레임 단위로 실행한다. dsda-doom의 연습 모드는 웨이포인트 시각화를 지원한다.
커스텀 WAD 가이드: 모딩 씬 탐험
둠의 진정한 재미는 커스텀 WAD에 있다. 30년이 넘는 역사 동안 수만 개의 맵이 제작되었다.
필수 플레이 WAD
둠 언블록 WTF 사용자들을 위한 추천 목록:
- Sunset Series: 입문자용 맵팩, 난이도 곡선이 완만
- Alien Vendetta: 중급자 챌린지, 플로우 디자인의 교과서
- Scythe 2: 속도런 친화적, 루트 최적화의 재미
- Sunder: 극한 난이도, 플랫포밍과 컴뱃의 조화
- Valcan: 시각적 스펙터클, 모던 매핑의 정점
WAD 구조 분석
WAD 파일은 헤더와 림프로 구성된다:
- 헤더: 12바이트, 식별자 + 림프 카운트 + 오프셋
- 림프 디렉토리: 각 림프의 이름, 크기, 위치
- THINGS: 아이템, 적, 플레이어 스타트 위치
- LINEDEFS: 벽 정의, 특수 효과 트리거
- SIDEDEFS: 벽 텍스처, 오프셋
- VERTEXES: 정점 좌표
- SEGS: BSP 렌더링용 세그먼트
- SSECTORS: 서브섹터 정의
- NODES: BSP 트리 노드
- SECTORS: 바닥/천장 높이, 라이팅
- REJECT: 몬스터 어그로 매트릭스
- BLOCKMAP: 충돌 감지 그리드
결론: 브라우저 둠의 미래
2024년 현재 둠 언블록은 단순한 레트로 게임이 아니다. WebGPU의 등장으로 레이 트레이싱이 가능해졌고, WebAssembly SIMD로 성능이 비약적 향상되었다. 원본 1993년 코드를 기반으로 30년간 축적된 모딩 씬의 자산을 브라우저에서 즐길 수 있다는 것은 기술적 기적이다.
둠 언블록 66, 둠 언블록 76, 둠 언블록 911, 둠 언블록 WTF 등의 사이트들이 존재하는 이유는 명확하다. 전 세계 게이머들이 여전히 둠을 플레이하고 있기 때문이다. 학교 컴퓨터실, 직장 휴게실, 인터넷 카페 어디서든 접속하여 30년 전의 FPS 혁신을 체험할 수 있다.
Doodax.com은 이 경험을 최적화된 형태로 제공한다. WebGL 렌더링, 물리 엔진, 입력 최적화, 브라우저 호환성까지 모든 측면에서 기술적 우위를 점한다. 이 가이드가 한국 게이머들의 둠 플레이에 실질적 도움이 되기를 바란다.
이제 무기를 들고 지구를 구원하러 가자. demons wait.