게임 화면이 계속 바뀐다고 해서 그저 그림만 그리는 게 아닙니다. 실제로는 매번 플레이어의 입력을 받아들이고 캐릭터를 움직여야 하죠. 애니메이션을 재생하고 물리 계산도 부지런히 해야 합니다. 심지어 소리도 틀고 네트워크 상태도 맞춰야 합니다. 이처럼 수많은 기능이 규칙적으로 갱신되어야 게임이 살아납니다.

게임을 움직이는 거대한 반복문

이 모든 일을 하나로 묶어주는 틀이 있습니다. 바로 게임 루프(Game Loop)입니다. 이름 그대로 게임이 실행되는 동안 계속 도는 큰 반복문이죠. 한 번 돌고 끝나는 게 아니라 종료할 때까지 계속됩니다.

렌더링 루프가 화면을 그리는 데 집중한다면 이것은 다릅니다. 게임 전체를 움직이게 하는 상위 개념의 반복 체계라고 볼 수 있죠. 각 시스템은 이 안에서 자신의 역할을 수행합니다. 프로그래머에게는 게임의 호흡을 만드는 아주 중요한 부분입니다.

모든 기능이 같은 속도일 필요는 없습니다

여기서 짚고 넘어가야 할 점이 있습니다. 모든 기능이 다 같은 속도로 갱신될 필요는 없다는 사실이죠. 애니메이션은 보통 초당 30번에서 60번이면 충분합니다. 그 정도만 되어도 우리 눈에는 아주 부드럽게 보이니까요.

게임을 살아 움직이게 만드는 심장 게임 루프 이해하기

오히려 억지로 횟수를 늘릴 필요가 없습니다. 화면에 그려지는 주기와 비슷하게 맞추면 되죠. 불필요한 연산은 줄이는 편이 성능에 좋습니다. 하지만 다른 기능은 사정이 좀 다릅니다.

물리 계산은 더 정밀해야 합니다

반면 물리 시뮬레이션은 훨씬 더 예민합니다. 세밀한 계산을 요구하는 경우가 많아 더 자주 업데이트해야 하죠. 초당 120번처럼 높은 빈도로 도는 것이 안정적일 수 있습니다. 그래야 충돌 판정이 정확하게 나옵니다.

만약 빈도가 낮아지면 결과가 이상해질 수 있습니다. 힘이 누적되는 계산에서 오차가 커질 위험도 있죠. 그래서 물리 엔진은 화면보다 더 빠르게 도는 경우가 많습니다.

인공지능은 천천히 결정해도 괜찮습니다

인공지능(AI)은 또 다른 특징을 가집니다. AI의 판단은 매 프레임 바뀔 필요가 거의 없거든요. 적이 어디로 갈지 공격을 할지는 가끔 정해도 충분합니다. 매초 한두 번만 결정해도 플레이하는 데는 지장이 없죠.

화면 그리는 속도에 AI를 억지로 맞추면 손해입니다. 쓸데없는 계산만 늘어나 컴퓨터 자원을 낭비하게 됩니다. 각 시스템은 자신에게 맞는 업데이트 빈도가 따로 있습니다. 이를 무시하고 모두 똑같이 돌리는 건 좋지 않습니다.

가장 기초적인 루프의 설계 방식

물론 처음 배울 때는 가장 쉬운 형태가 좋습니다. 모든 기능을 하나의 루프 안에서 순서대로 처리하는 방식이죠. 입력을 받고 게임 상태를 업데이트합니다. 그 뒤에 물리와 AI를 계산하고 마지막에 화면을 그립니다.

이런 단일 루프는 엔진 전체를 관장하는 마스터 역할을 합니다. 방식이 복잡하지 않아 이해하기 쉽고 구현도 간편하죠. 많은 기본 엔진이 이런 형태에서 출발합니다. 처음 공부하실 때 많이 보게 될 형태입니다.

프로그래머가 통제해야 할 엔진의 뼈대

물론 실제 상용 엔진은 더 복잡한 방법을 씁니다. 시스템마다 주기를 분리하거나 스레드를 나누기도 하죠. 하지만 반복 위에서 게임이 존재한다는 점은 변하지 않습니다. 이 루프가 그 반복의 중심을 잡아줍니다.

무엇을 얼마나 자주 갱신할지 정하는 것이 중요합니다. 이 설계를 어떻게 하느냐에 따라 게임의 반응성이 달라지죠. 게임 루프는 게임 엔진의 성격을 결정짓는 아주 튼튼한 뼈대입니다.

제목 영역
이미지