책
StackExchange 질문
Q.
물리 기반 멀티플레이 레이싱 게임 제작 중. 차들은 서로 무기로 쏠 수 있음. 빠르게 움직이는 멀티 - 레이싱 게임. 좋은 방법?
A.
일반적으로 서버는 클라와 주기적으로 정보 Share. 충돌은 클라/서버 각각 계산.
클라 상태는 이전 state을 기반으로 추정(Dead Reckoning)
Server 정보가 Client에 오면 차이점을 보간 이용하여 state transition
대부분 Clients의 시뮬레이션 타임을 서버보다 조금 뒤에 둠. 서버 상태로 수정 가능하니.
https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking 글 추천함
A.
1. 서버에서 다 계산하고 클라에 쏘기. 쉽고 좋은 방법이지만 서버 리소스가 많이 들고, bandwidth 큼. 플레이어 기준 일정 범위 내 정보만 보내는 식의 최적화
2. 서버/클라 모두 시뮬. 서버가 클라 교정. 다른 플레이어꺼도 클라에서 다 계산하되, keypress sync.
예를 들어 5초마다 서버가 물리 시뮬 결과 broadcast. 각 클라는 Change.
다만 network lag과 packet loss 에 따라 다른/내 플레이어 캐릭터가 글리칭/순가이동을 볼 수 있음
3. 각 클라는 자기꺼만 계산하고 다른 곳으로 싱크보냄. 소유권이 서로 다른 object의 충돌 힘듦. (로블록스 방식인듯)
복잡한 개념 - 어떤 물체는 그 어떤 클라에도 소유 안되기도.
1번은 4-5명 lan
2번은 실용적 - 구현힘듦 + 서버에서 시뮬 돌리는 리소스 부담.
3번은 서버 부담 훨씬 줄음. ptp 네트워크에서 좋음. 다만 서로 소유권 다른 objct 싱크 어려움
Dead Reckoning이란?
예정된 Course와 속력Speed을 요소로 예정 위치를 결정하는 계산법
Valve Developer Community - Source Multiplayer Networking (윗글 2번 관련)
Source Multiplayer Networking
일반적으로 클라는 1초 20 snapshots.
클라는 보간하여 렌더링.
Input Prediction - 내 플레이어는 내 입력으로 예측 이동
Lag Compensation - 서버에서 클라의 input lag을 예상하여 input 시점 플레이어 위치 추측
Unity MultiPlayer Network 유니티 멀티 물리
Server Authoritative Physics
Server 에서만 물리 시뮬
Q. Real Time 멀티 - 물리 기반 - 플레이어 서로 충돌. Unity 사용.
A.
Jos-Yule : 각자 차 연산 소유권. 다른 플레이어와 locally 충돌 시 '다른 플레이어'의 것도 연산.
그냥 충돌 시 그것도 연산하고, 이후에 서버에서 정보 받아 보간한다는 것인듯.
물론 내거에서는 충돌햇는데, 다른 플레이어에서는 충돌 안한걸로 될 수도.
마지막엔 질문자가 자신의 해결책을 올림. 좀 더 볼 것