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