
콘솔은 되는데, PC는 왜 안 됐을까
혹시 옛날 도스(DOS) 게임 해보신 분 있나요? 1990년 즈음 PC 게임들은 화면이 옆으로 넘어갈 때 한 화면씩 뚝뚝 끊기면서 바뀌었어요. 그런데 같은 시기 닌텐도(NES)의 슈퍼마리오는 화면이 스르륵 부드럽게 흘러갔죠. 같은 '게임기'인데 왜 이런 차이가 났을까요?
답은 하드웨어에 있어요. 닌텐도에는 PPU라는 그래픽 전용 칩이 들어 있었는데, 이 칩에 '화면을 몇 픽셀 옆으로 밀어줘'라고 명령하는 전용 장치(스크롤 레지스터)가 있었거든요. 게임이 숫자 하나만 바꿔주면 칩이 알아서 화면 전체를 부드럽게 밀어줬어요. 반면 당시 PC에 꽂혀 있던 EGA 그래픽 카드는 이런 기능을 제대로 지원하지 않았어요. 그래서 화면을 옆으로 한 픽셀 밀려면 CPU가 화면 전체(약 32만 픽셀)를 매 프레임 다시 그려야 했는데, 그 시절 286 CPU로는 어림도 없었죠.
카맥의 발상 전환: '다 그리지 말고, 바뀐 것만 그리자'
여기서 id 소프트웨어의 존 카맥이 등장해요. 'Commander Keen(커맨더 킨)'이라는 게임을 만들면서 그가 찾아낸 핵심 기술이 두 가지예요.
첫째는 하드웨어 패닝이에요. EGA 카드는 화면에 보이는 영역보다 조금 더 큰 메모리를 갖고 있었어요. 카맥은 화면 밖에 미리 한 줄을 그려두고, EGA의 '화면 시작 위치' 레지스터와 '픽셀 단위 이동' 레지스터를 살짝 건드려서 보이는 창을 옆으로 슬쩍 옮겼어요. 즉 그림을 새로 그리는 게 아니라 '보는 위치'만 옮긴 거죠. 마치 큰 종이 위에 창문 하나 뚫어놓고, 종이는 안 움직이고 창문만 옮기는 느낌이에요.
둘째가 그 유명한 적응형 타일 갱신(Adaptive Tile Refresh)이에요. 이게 뭐냐면, 화면을 작은 정사각형 '타일' 단위로 쪼개놓고, 이전 프레임과 비교해서 실제로 바뀐 타일만 다시 그리는 기법이에요. 화면이 옆으로 한 칸 밀리면 사실 대부분의 타일은 그대로고, 새로 나타나는 가장자리 한 줄만 새로 그리면 되거든요. 화면 전체를 다시 그리는 것과 비교하면 일이 수십 분의 일로 줄어든 거예요. 이 두 가지를 합치니 286 PC에서도 콘솔처럼 부드러운 스크롤이 가능해졌어요.
닌텐도에 거절당한 게 신의 한 수
재미있는 뒷이야기가 있어요. 카맥과 로메로 팀은 이 기술이 너무 잘 되니까, PC에서 슈퍼마리오 1편 첫 스테이지를 거의 똑같이 재현한 데모를 만들어 닌텐도에 보냈어요. '당신 게임을 PC로 이식할 수 있다'는 제안이었죠. 닌텐도는 콘솔에 집중한다며 거절했는데, 덕분에 이 팀은 그 기술로 자기들만의 오리지널 게임 커맨더 킨을 만들었고, 그때 쌓은 수익과 경험이 나중에 둠(DOOM)과 퀘이크(Quake)로 이어졌어요.
지금 우리에게 주는 교훈
요즘은 GPU가 알아서 다 해주니 이런 저수준 트릭이 옛날이야기처럼 들릴 수 있어요. 하지만 핵심 아이디어, 즉 '전부 다시 계산하지 말고 바뀐 부분만 갱신하라'는 생각은 지금도 곳곳에 살아 있어요. 리액트(React)의 가상 DOM이 바뀐 컴포넌트만 다시 렌더링하는 것도, 게임 엔진의 더티 렉트(dirty rectangle) 기법도, 데이터베이스의 증분 업데이트도 전부 같은 철학이거든요. 또 하나, '하드웨어의 숨은 기능을 끝까지 파고들어 한계를 돌파한다'는 자세도 새겨둘 만해요. 카맥은 EGA 매뉴얼 구석에 적힌 레지스터 하나에서 돌파구를 찾았으니까요.
이 옛날 엔진 백서를 읽다 보면, 화려한 프레임워크보다 하드웨어의 동작 원리를 정확히 이해하는 게 얼마나 강력한 무기인지 새삼 느끼게 돼요.
여러분은 최근에 '바뀐 것만 처리해서' 성능을 끌어올린 경험이 있나요? 그리고 요즘처럼 추상화가 두꺼워진 시대에, 이런 저수준 지식은 어디까지 알아둘 가치가 있다고 생각하세요?
🔗 출처: Hacker News
TTJ 코딩클래스 정규반
월급 외 수입,
코딩으로 만들 수 있습니다
17가지 수익 모델을 직접 실습하고, 1,300만원 상당의 자동화 도구와 소스코드를 받아가세요.
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공