인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

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

유니티 연동 #4

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

작성

·

663

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

Rookiss님의 프로필 이미지
Rookiss
지식공유자

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

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

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

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기