3D서버 만들 때 질문입니다
790
작성자 없음
작성한 질문수 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에서는 검증을 어떻게 하는게 맞을까요?
답변 1
3
FPS는 MMO랑 방법론이 완!전!히! 다릅니다.
우선 물리 엔진을 그대로 서버에 이식해야 하기 때문에
서버도 최소 10~20프레임으로 Update를 연산을 해야 하구요.
1초 단위로 위치를 보내는게 아니라, 1초에 5번 이상은 보내는게 일반적입니다.
MMO처럼 많은 유저가 모이는 개념이 아니라서
굳이 멀티쓰레드로 갈 필요도 없고 한 방은 1 쓰레드로 처리하면 됩니다.
그리고 FPS 게임은 그냥 데디 서버를 쓰는걸 권장 드립니다.
배그도 자체 서버가 아니라, 언리얼 데디 서버 기반으로 만들었습니다.
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





