[용어] 락스텝(Lock Step) 알고리즘
![]()
1. 락스텝이란?
군인들이 발맞춰 걸어가는 것을 의미하는 락스텝에서 유래된 용어.
누군가 신호를 주면 그 신호에 맞추어 모두가 똑같은 행동을 하는 것을 의미한다.
실행이 완전히 동일한 결정론적 로직을 바탕으로 입력만 동기화하는 것.
![]()
2. 구동 원리
-
컴퓨터 하나하나가 P2P 방식으로 다른 모든 컴퓨터에 연결하는 방식이다.
-
개별 유닛을 하나하나 동기화하는 대신 플레이어가 입력한 명령을 동기화시킨다.
-
하나의 플레이어가 신호를 주면 모든 클라이언트가 동시에 업데이트한다.
-
업데이트를 함으로써 한 공간(씬)에 있는 플레이어들이 입력 신호만 주고 받는다.
-
명령(어디로 이동을 해라)
-
시간(언제 화면에 뿌려라)
-
체크섬(게임 상태에 대한 해킹 방지용)
-
![]()
3. 시간에 대한 공식
언제 실행해야 하는 지에 대한 미래 시간을 입력 정보와 함께 보낸다.
미래시간 = 현재시간 + RTT(왕복레이턴시) ÷ 2 + 상수(이걸로 조정한다.)
![]()
4. 락스텝 알고리즘 장점
-
입력 명령만을 주고 받는다. 따라서 대역폭 관리가 수월하다.
-
통신량이 매우 적어 리플레이 저장 기능을 추가하기 쉽다.
-
한 씬에 있는 많은 캐릭터가 적은 통신량으로 정확하게 동기화가 되어 보이게 가능하다.
![]()
5. 락스텝 알고리즘 사용 시 고려할 점
-
게임 인스턴스마다 시뮬레이션을 독자적으로 수행하게 되므로 각 인스턴스를 다른 인스턴스와 정확히 동기화할 수 있는지가 중요하다.
-
참가자 수가 적은 RTS 게임에서 사용해야 한다. 참가자 수가 많아지면 레이턴시가 급증한다.
![]()
6. 락스텝 알고리즘 단점
-
게임 중간에 다른 플레이어가 들어오는 것에 대한 구현이 어렵다.
-
플레이에 관여하는 연산에 부동 소수점 사용이 불가능하다.
-
부동 소수점 연산은 하드웨어 종류에 따라 결과가 미묘하게 다르다. 이 미세한 차이가 누적되면 나비효과처럼 큰 차이로 이어진다.
-
이 문제를 해결하려면 게임 플레이에 관여하는 연산은 모두 고정 소수점으로 해야 한다.
-
-
플레이어 수가 많아지기 어렵다.
- 통신량이 플레이어 수에 비례해서 증가하기 때문이다.
-
입력 속도에 예민한 게임에 부적합하다.
-
락스텝 동기화 알고리즘에서는 필연적으로 캐릭터에게 넣은 행동은 미래 시간이 되어야 움직이기 때문.
-
그래서 방향키로 직접 이동하는 방식에 이 알고리즘을 적용하면 게임 플레이가 매우 답답하게 느껴진다.
-
많은 전략 시뮬레이션 게임이 그렇듯이 이동 목표 지점을 찍어서 캐릭터를 움직이는 방식에 적합하다.
-
![]()