게임 루프, 시간, 틱 이해하기

Screeps는 실시간 게임입니다. 게임 시간은 기본적으로 게임 서버가 시작된 이후 경과한 게임 "틱(tick)"(턴, 사이클)의 개수입니다. 현재 틱 번호는 Game.time 속성에 저장됩니다. 이는 게임 수명 전체에 걸쳐 증가하는 전역 카운터입니다.

일반적으로 틱은 여러분의 main 모듈에서 무한 루프로 진행됩니다. 이 루프는 “턴 기반 + 멀티플레이어 기반”이라는 점을 이해하는 것이 중요합니다. 즉 다음 틱(다음 Game.time 값)은 모든 플레이어의 모든 main 모듈이 완전히 실행을 마친 뒤에야 시작됩니다.

이제 틱 실행 메커니즘을 (편의상) 시작/중간/끝 3단계로 나누어 살펴보겠습니다.

틱의 시작(beginning) 에는 어떤 게임 상황이 존재합니다. 즉 여러 게임 오브젝트와 그 속성 값들이 있습니다. 이 속성 값의 변화, 새로운 오브젝트의 등장, 기존 오브젝트의 해체/삭제는 모두 다음 틱의 시작 시점에만 반영됩니다.

틱의 중간(middle) 에는 main 모듈이(그리고 그로부터 require 된 모듈들이) 실행됩니다. main은 틱 시작 시점의 “변하지 않는” 게임 상태를 기준으로 동작합니다. 예를 들어 creep.move()를 실행한 뒤 같은 틱에 creep.attack()를 실행하더라도, 공격은 이전 좌표에서 수행됩니다. creep.pos.x / creep.pos.y 속성은 다음 틱에서야 바뀌기 때문입니다.

틱의 끝(end) 에는 main에서 지정한 명령들이 누적되어, 다음 틱의 시작 시점에 서로 독립적으로 즉시 게임 상황을 변경합니다. 이때 충돌이 발생할 수 있습니다. 예를 들어 여러 크립이 같은 좌표로 이동하려 하거나, 서로 모순되는 명령을 예약해 둔 경우입니다. 이러한 충돌은 사전에 정의된 우선순위에 따라 해결됩니다. 반대로 상호 공격은 충돌이 아니므로, 크립들이 동시에 죽을 수도 있습니다.

추가 정보

  • 물리적으로 main 실행의 자원 사용량은 사용 가능한 CPU에 의해 제한됩니다(Game.cpuLimit 참고).
  • 현재 틱에서 실제로 사용한 CPU 양은 Game.getUsedCpu로 확인할 수 있습니다.
  • 게임 틱 카운터(Game.time)와 현실 시간의 상관관계는 서버 전체 용량/부하에 따라 달라집니다.
  • 틱 사이에 유지되던 런타임 전역 스코프(모든 전역 변수 포함)는 매 틱마다 초기화됩니다. 자세한 내용은 이 문서를 참고하세요.
  • 콘솔 명령도 동일한 규칙을 따릅니다. 하나의 틱 안에서 실행되며, main의 끝에 추가된 것처럼 처리됩니다.

함께 보기