inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

유니티 연동 #4

3D서버 만들 때 질문입니다

790

작성자 없음

작성한 질문수 0

0

복학 전에 개인 작업으로 FPS게임서버를 만들고 있습니다.

구현된 것들:

 - 신규 유저 접속 시 기존 유저 데이터 전송, 기존 유저에게 신규 유저 스폰 전송

 - 키보드 입력(Vertical, Horizontal)을 하나의 Vector3에 저장하여 이전 값과 다를 경우 패킷을 전송 ( 데드레커닝이 맞는진 모르겠음)

 - 카메라 회전 값을 각 클라이언트에서 0.25초 단위로 동기화 패킷 전송 ( 회전값은 서버에서 검증이 필요없을 거라 생각해서 검증 없이 Echo )

 

위에 적은 대로 위의 기능은 문제없이 잘 작동하지만 이동 동기화에 대해서 문제가 심각합니다....

데드레커닝처럼 이전값과 다를 때만 패킷을 보내는데, 상대 클라이언트는 회전값 동기화가 0.25 + (내RTT/2 + 상대RTT/2)이상이라 이동패킷이 더 빠르게 가버리면 위치값에 대한 데이터 일관성이 깨집니다.

그래서 추가로 1초 단위로 현재 위치를 서버에 전송합니다. 서버는 새로운 위치값을 받고 자신이 갖고 있던 해당 플레이어의 위치값 ( 서버 내에서도 이동방향, 회전값, RTT/2, 오차범위를 기준으로 위치값을 0.25초 단위로 업데이트함) 과 비교하여 이 값이 정상적인 데이터인지 검증합니다.

만약 결과가 정상적이라면 Broadcast, 비정상적이라면 Leave로 구현했습니다.

그런데 문제는 서버에서 검증하는 시간 + 내 RTT / 2 + 상대 RTT / 2 차이 때문에 데드레커닝으로 예측하더라도 계속 이전 위치로 돌아가는 현상이 발생했습니다.

데드레커닝을 포기하자니 너무 느린 반응때문에 FPS에 적합하지 않은 것 같고, 서버 검증을 포기하자니 에디터에 Inspector에서 위치 이동만 해도 핵처럼 보였습니다.

FPS에서는 검증을 어떻게 하는게 맞을까요?

fps network 데드레커닝 서버검증 C# unity

답변 1

3

Rookiss

FPS는 MMO랑 방법론이 완!전!히! 다릅니다.
우선 물리 엔진을 그대로 서버에 이식해야 하기 때문에
서버도 최소 10~20프레임으로 Update를 연산을 해야 하구요.
1초 단위로 위치를 보내는게 아니라, 1초에 5번 이상은 보내는게 일반적입니다.
MMO처럼 많은 유저가 모이는 개념이 아니라서
굳이 멀티쓰레드로 갈 필요도 없고 한 방은 1 쓰레드로 처리하면 됩니다.

그리고 FPS 게임은 그냥 데디 서버를 쓰는걸 권장 드립니다.
배그도 자체 서버가 아니라, 언리얼 데디 서버 기반으로 만들었습니다.

0

Insomnia

감사합니다! 많이 찾아본다고 생각했는데 아직 서버에 대한 이해도가 많이 부족했네요 ㅋㅋ;
더욱 정진하겠습니다

TLS 질문드립니다.

0

49

2

SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.

0

51

2

Unity Span

0

79

2

XML, Dll 차이점

0

109

2

Session 질문입니다

0

81

1

Write Read 커서 키워드

0

77

1

더미 클라이언트 수에 따른 OnDisconnect 발생

0

72

2

네트워크 Send 전담 스레드 배치

0

99

2

UnhandledException 으로 서버 터지는 경우

0

87

2

컨텐츠 단, 엔진 단

0

106

1

질문 있습니다

0

77

2

C# 게임서버 3D MMORPG

0

150

2

유니티6 버전

0

98

2

receive하는 부분과 send하는 부분의 차이

0

134

2

커서의 위치의 중요성

0

104

2

C++ 전혀 모르는데 C# 서버

0

170

2

강의에 질문이 있습니다

0

86

2

멀티스레드 이해도 질문

0

95

1

500 vs 500

0

130

3

OnAcceptHandler 액션 함수

0

62

1

이 정도 서버의 객관적인 수준이 궁금합니다.

0

193

2

36. Serialization #3 에서 string (name) 코드 수정 질문

0

83

2

외부 컴퓨터와의 통신 방법이 궁금합니다

0

107

1

스핀락 질문.

0

110

2