인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

Hello World님의 프로필 이미지
Hello World

작성한 질문수

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

3d 게임에서의 이동 동기화 패킷 관련해서 질문드려요.

해결된 질문

작성

·

1.5K

0

1. 보통 3d게임에서 이동 동기화 패킷을 클라이언트가 ms단위로 보내는 걸로 알고 있는데 보통 초당 몇번의 이동 패킷을 서버로 보내야 케릭터 움직임이 부드럽게 동기화가 되는지 궁금합니다.  실무에서 어느 정도 정해진 평균치 같은게 있는지도 궁금해요.

2. 꼭 ms단위로 보낼 수 밖에 없는지 궁금합니다. 캐릭터의 다이나믹한 움직임 및 언덕 올라가기등.. 서버에서도 똑같이 시뮬레이션 할 수있다면 서버 클라 각자 이동 시뮬레이션을 돌려서 도착지점에서 동기화 해주면 될 것같지만 현실은 서버에서 그런 시뮬레이션 하기가 어렵기 때문에 클라가 그냥 무식하게 이동패킷을 막 쏘는 것 같은데 이런 경우는 현실적으로 어쩔 수 없는 부분일까요..? 이동 패킷 처리 비용이 너무 아깝네요.. 실무에서는 이런경우 어떤 식으로 대처하는지 궁금합니다. 

타일 단위로 움직이는 2d나 턴제 게임서버 개발하고 싶네요..

강의 항상 감사드립니다~!

답변 1

6

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

MMO 게임마다 조금 차이가 있지만
일반적으로 1초에 4~5번 정도 클라에서 패킷 요청을 받으면
자연스럽게 보정 처리가 됩니다.

사실 마우스로만 입력을 받는 게임(리니지PC)은 목적지만 찍어서 보내면,
클라에서도 현재 위치와 무관하게 목적지를 향해 달리게 만들면 자연스럽게 보정이 되기 때문에
살짝 동기화 패킷이 늦어도 괜찮습니다.
반면 키보드로 조작하는 (와우 등) 게임은
캐릭터가 '바로 앞'으로 이동하는 개념이고
심지어 바라보는 방향에 따라 사양이 달라지는 경우도 있기 때문에 (와우 도적의 뒷치기 등) 위치에 민감합니다.
따라서 상대적으로 동기화 빈도가 높고 너무 느리게 패킷을 보내면
위치가 쉽게 틀어지는 특징이 있습니다.

보통 MMO에서는 사용자에 대한 위치 계산을 클라에 통으로 위임하고
서버는 아예 계산하지 않습니다.
단지 클라에서 다음 위치 정보가 오면
그냥 러프하게 이동 가능한 지역인지,
보내준 이동 속도가 말이 되는지 체크만 하는 정도지요.

이렇게 될수밖에 없는 이유는 클라에서는
자연스럽게 렌더링을 하기 위해서라도
지형의 세부 좌표를 다 알고 있어야 하기 때문입니다.
지형이나 3D 오브젝트도 결국 일련의 삼각형 정점들로 이루어져 있는데,
이 삼각형 안의 모든 세세한 좌표를 서버에서 일일히 계산할 수는 없습니다.
반면 클라는 최소 60프레임 (1초당 60번)씩 계산을 하고
미세한 이동에 대한 좌표도 실시간으로 계산해서
그 위에 '자연스럽게' 캐릭터를 올려놔야 합니다.

참고로 처음 만들 때는 이런 저런 테스트를 해보면 많은 도움이 됩니다.
제 경우 처음에 3D 포폴을 만들 때 
말씀하신것처럼 패킷 동기화에 소요되는 패킷량이 아까워서
현재 이동하는 방향이 바뀌는 순간에만 딱 동기화 패킷을 보내주게 했더니,
미세한 틀어짐이 계속 나비효과로 일어나서
'강제 보정' (가위 눌리는 현상이랄까요)을 해주지 않으면
안되는 상황이 빈번하게 발생했던 기억이 있네요.
그리고 역시나 실무에 가보니 대략 0.2초마다 한번씩은 보내도록 되어 있었습니다.

Hello World님의 프로필 이미지
Hello World

작성한 질문수

질문하기