ved_Rony
article thumbnail

Lockstep 동기화 기법은 멀티플레이어 게임에서 사용되는 동기화 방식 중 하나이다. 완전히 동일한 로직을 바탕으로 매 프레임마다 모든 플레이어의 입력값을 동기화하고 각자 동일한 시뮬레이션을 진행한다.

 

많은 캐릭터와 복잡한 로직을 간단하게 동기화할 수 있다. 입력 조작과 프레임 진행만 동기화하면 게임 로직이 동기화된 상태로 진행된다. 결정론적으로 로직을 작성하는 것이 매우 어렵다. 특히 부동소수점의 처리는 하드웨어마다 매우 다르고, 옵션을 통해서 일치시키면 성능이 대폭 떨어지는 경우가 많다. 10명이하의 플레이어 게임에 사용한다. 참가자 수가 늘어날 수록 입력 패킷 도달 지연이 발생할 가능성이 크게 높아지기 때문이다.

 

현재 내가 개발하고 있는 게임에서 플레이어의 인풋을 히스토리 (인풋값의 리스트)를 만들고 특정 프레임(ex. 10 프레임, 20 프레임) 마다 히스토리 리스트르 동기화 하고 있다.

 

다음과 같이 동기화 해주고 있다.

1. 자신(owner)의 입력값을 리스트로 가지고 있는다.
2. 그 리스트를 동기화 가능한 타입(INetworkserializable)의 히스토리 리스트로 변환한다.
3. 매프레임마다 히스토리 리스트를 체크하고 그를 기반으로 owner시뮬레이션을 돌려준다. 
4. ServerRpc로 히스토리 리스트를 복사하고, 동기화

5. 동기화된 리스트로 owner제외 다른 클라이언트들 시뮬레이션 해준다.


owner의 인풋 리스트를 동기화 하므로, 플레이어 간의 입력 동기화 문제를 최소화할 수 있다. 하지만 이 방식은 네트워크 지연이나 패킷 손실 등의 문제가 발생할 경우 전체적인 게임 플레이가 지연될 수 있습니다. 또한, 지연되었을 경우 게임의 동적인 변화가 어려울수가 있다. 예를 들어, 배경 애니메이션이 움직이고 있는 데, 입력값이 느리게 들어와 배경 애니메이션과 플레이어의 동작이 의도대로 흘러가지 않을수도 있다.

이러한 특징 때문에 리얼타임 게임에서 사용되는 경우가 많다고 한다.

 

profile

ved_Rony

@Rony_chan

검색 태그