플레이어가 앞으로 이동하는 키를 눌렀다고 해 보겠습니다. 클라이언트는 즉시 캐릭터를 움직여 보일 수 있지만, 다른 플레이어에게 보여 줄 위치와 벽을 통과했는지는 누가 확정할까요? 실시간 게임 서버는 여러 입력을 하나의 게임 규칙과 월드 상태에 적용해 결과를 정합니다.
입력과 권위 상태
입력은 ‘앞으로 이동하려 한다’는 의도입니다. 위치와 피해량 같은 결과는 그 의도를 현재 상태와 규칙에 적용한 뒤 얻습니다. 클라이언트가 보낸 최종 위치를 그대로 믿으면 벽 통과나 속도 위반뿐 아니라 지연·중복 입력으로도 상태가 어긋날 수 있습니다.
권위 서버 모델에서는 서버가 이동·충돌·자원 차감 등 합의된 범위의 결과를 확정합니다. 입력에는 캐릭터와 세션, 순서 번호를 연결하고 중복·오래된 입력을 구분합니다. 이 구조가 네트워크 지연을 없애지는 않으므로 클라이언트 예측과 서버 보정을 함께 사용할 수 있습니다.
월드 상태와 시간 단계
서버는 캐릭터의 위치·속도·체력, 지형과 문 상태 같은 월드 데이터를 관리합니다. 실시간 시뮬레이션에서는 일정한 시간 간격인 틱마다 입력과 상태를 갱신하는 방법이 흔합니다. 20Hz라면 목표 간격은 50ms입니다.
단순한 이동 모형에서 위치 x=0, 속도 2m/s, 시간 간격 0.05초라면 다음 위치는 0+2×0.05=0.1m입니다. 실제 게임에서는 그 구간에 벽이 있는지, 경사나 가속이 있는지 등을 추가로 계산합니다. 끝점이 비어 있다는 사실만으로 중간 이동 경로가 안전한 것은 아닙니다.
그림을 글로 읽기
- 입력 수집·순서·유효성
- 이동·행동 계산
- 충돌·전투·자원 판정
- 확정 상태·이벤트 전달
- 입력 수집·순서·유효성 → 이동·행동 계산: 허용된 입력
- 이동·행동 계산 → 충돌·전투·자원 판정: 후보 변화
- 충돌·전투·자원 판정 → 확정 상태·이벤트 전달: 권위 결과
공간 후보와 정밀 판정
물체가 천 개면 모든 쌍은 499,500개입니다. 매 틱 모든 형상을 정밀 비교하기보다 격자나 트리로 근처 후보를 먼저 추릴 수 있습니다. 후보 단계에서는 실제 충돌을 놓치지 않는 보수적 범위를 사용하고, 최종 형상 검사는 다음 단계에서 수행합니다.
경로 탐색도 비슷하게 공간 표현을 사용하지만 질문은 다릅니다. 경로는 목표까지 갈 계획이고 충돌은 지금 이동 구간을 실행해도 되는지의 판정입니다. 길을 찾은 뒤 문이 닫히면 계획이 낡으므로 이동 직전 재검증이 필요합니다.
상태 전달과 화면 예측
서버가 모든 객체의 모든 필드를 모든 플레이어에게 보낼 필요는 없습니다. 주변 위치는 관심 영역에 따라 보내고, 비공개 인벤토리나 팀 정보는 별도 권한으로 제한합니다. 전송량을 줄이는 것과 공개 권한을 정하는 것은 함께 고려해야 합니다.
클라이언트는 입력을 먼저 적용해 화면 반응을 빠르게 만들 수 있습니다. 서버가 입력 10까지 확정한 상태를 보내면 클라이언트는 그 상태에서 미확정 입력 11 이후만 다시 적용합니다. 화면을 부드럽게 보간하는 것은 권위 피해나 탄약을 임의로 바꾸는 것과 다릅니다.
틱 예산과 지속 과부하
50ms마다 실행해야 하는 틱의 계산에 60ms가 계속 걸리면 매번 지연이 더 쌓입니다. 밀린 틱을 무제한 따라잡는 루프만으로 해결되지 않습니다. 전투·충돌처럼 반드시 지킬 규칙과 일부 AI·통계처럼 지연할 수 있는 일을 구분해야 합니다.
예를 들어 틱 10의 입력이 서버에 늦게 도착하면 입력 순서 번호를 기준으로 이미 확정한 틱에 다시 적용하지 않고, 아직 처리하지 않은 틱의 입력 큐에 넣어야 합니다. 시험에서는 같은 입력 로그를 두 번 재생해 위치·체력·틱 번호가 같아지는지, 클라이언트가 보인 예측 위치와 서버 확정 위치가 다를 때 보정은 화면만 바꾸고 권위 체력은 바꾸지 않는지 확인합니다.
AI 평가 빈도를 낮추면 공격·회피 반응도 달라질 수 있습니다. 따라서 최적화는 CPU 감소뿐 아니라 게임 결과와 공정성까지 비교해야 합니다. 입력 로그·난수 상태·틱 번호·정책 버전을 기록하면 같은 판정을 재현하는 데 도움이 됩니다.
세부 학습 경로
권위 입력 → 틱 예산 → 공간 후보 → 연속 충돌로 이어집니다. 이동 계획은 경로 공간, 네트워크 공개는 AOI에서 다룹니다.