서버 동기화 방식

C# 2021. 7. 23. 12:28
728x90

Peer-to-Peer Lockstep 방식(RTS)

▶ 모든 Peer들의 상태값을 항상 완벽하게 일치 시킨다.

동일한 input을 동일한 타이밍에 주면 모든 Peer들의 결과값은 동일하다.

 

구현

 unit의 상태값(hp,위치)을 동기화하지 않고, 유저의 input(유닛생산,유닛선택,유닛이동,유닛이동및공격)만 동기화 한다.

한 Peer의 input을 동일한 타이밍에 모든 Peer에게 전달하기 위해 input delay를 준다.

스타크래프트의 경우 200ms라고 한다.

200ms안에 모든 Peer들에게 input을 전달한다.

Peer가 100ms만에 전달 받았다면 100ms후에 받은 input을 수행하고, 50ms만에 받았다면 150ms후에 수행하는 식이다.

이 딜레이를 속이기 위해서 유닛을 이동시키면 당장 이동하지는 않지만 제자리에서 소리나 애니메이션을 바로 한다.

(ex. 뮤탈 : 제자리에서 날개짓 시작 및 소리를 낸다.)

 

장점

구현이 간단하다

모든 Peer의 상태가 동일하기 때문에, Server같은 신뢰할수 잇는 중간 매개체를 둬서 Peer들의 상태를 시뮬레이션 할 필요가 없다.

모든 Peer의 상태가 동일하기 때문에, Peer들간의 상태값 불일치를 자연스럽게 좁혀줄 보간 처리가 필요 없다.

 

단점

Peer의 모든 input이 모든 Peer에게 전달 됨으로서 맵핵이 나올수 밖에 없다.

게임에 랜덤요소가 없어야 하거나, 있더라도 초기 게임을 시작하기 전에 random함수의 seed값을 동일하게 맞춰야 한다.

모든 Peer의 상태를 동일하게 하기 위해서, 모든 Peer가 input을 줄때까지 기다려야 한다.

가장 안 좋은 Peer의 latency가 모든 Peer의 latency가 된다.

한 Peer라도 input을 주지 않으면 모든 Peer의 게임 진행이 멈춘다.

게임이 시작된 상태에서 중간에 진입할수 없다.

Server같은 신뢰 할수 있는 대상이 전투상태값을 시뮬레이션 하고 있지 않기 때문에 게임 중간에 상태값을 줄 수 없다.

 

Client/Server 방식(FPS, MMORPG)

모든 Client들의 상태값을 항상 완벽하게 일치 시키려고 하지 않는다.

 대신에 Client들 사이에 Server라는 신뢰할수 있는 모델을 두고, Client들의 상태값이 Server의 상태값에 수렴하도록 만든다.

 

구현

 Client는 Server에게 유저의 상태값(hp,위치)이 아닌 행동(스킬 사용, 어떤 방향으로 이동)을 알리고 Server는 해당 행동을 받아서 상태값을 시뮬레이션 한다.

 Server는 다른 Client들에게 유저의 행동뿐만 아니라 시뮬레이션한 상태값도 같이 알린다.

 Client가 반응성을 위해 선처리한 상태가 Server와 다를수 있음으로 상태값도 같이 보내서 Client가 보간할수 있게 한다.

반응성을 높이기 위해 다른 유저에게 당장 영향을 주지 않은 행동들은 Server의 응답을 기다리지 않고, Client에서 먼저 선처리한 후 Server의 결과를 받아서 보간한다.

 이동 : 이동 자체가 다른 유저에게 당장 영향을 주지는 않음으로 Client에서 선처리 하고 후에 보간한다.

 공격 : 다른 유저에게 당장 영향을 줄 수 있는 행동이라서 Client에서 선처리 하지 않고 Server에 요청후 응답을 기다렸다 처리한다.

칼을 들어 올리는 모션(input delay)동안 Server에 요청해서 다른 Client들에게 공격을 알린후, 공격에 대한 효과 적용은 Client들과 Server모두 같은 순간에 이루어 지도록 한다.

 

장점

 유저의 행동이 Server를 거쳐서 다른 Client에게 전달될때 제한된 정보만 전달해서 보안성을 높일수 있다.

 Server에서 랜덤요소를 결정해서 알려줄수 있다.

 Client중 하나가 응답하지 않는다고 해서 모든 다른 Client가 기다릴 필요가 없다.

 게임이 시작된 상태에서 중간에 진입할수 있다.

 

단점

 Server가 Client의 행동들을 다 시뮬레이션 해야 한다.

 Client가 Server와의 상태값 불일치를 어색하지 않게 좁혀줄 보간 처리를 잘 해야 한다.

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침