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

먹물크림빵님의 프로필 이미지
먹물크림빵

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

클라이언트 이동키 입력시 처리방법

작성

·

596

0

안녕하세요 선생님

동영상 강의를 다보고 탑뷰, PVP, 논타겟 슈팅 게임을 만들고 있습니다.

그러다 이동키 관련되서 궁금한점이 생겨 질문드립니다.

w,a,s,d를 이용하여 캐릭터의 이동처리를 하는데 클라이언트 프레임이 60프레임이라고 했을때 프레임마다 패킷을 서버에 보내는것은 아닌것 같았습니다. 이거에 대한 여러가지 시도를 해봤는데 결과적으로 만족스럽지않았고 삽질만 하게 되었습니다. 이거에 대한 해결방법이 있을까요?

답변 1

1

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

매우 매우 매우 중요한 질문을 해주셨는데
사실 서버 연동의 80%는 이동 동기화라 해도 과언이 아닙니다.
게임 장르마다 동기화 방식이 달라지는데,
- 클라가 먼저 이동 처리하고, 서버한테 이동 의사를 보낼지 (혹은 서버 허락을 먼저 기다리고 이동할지)
- 서버는 몇 프레임으로 연산을 해야 하는지
등 여러 설계와 관련이 있습니다.

결론적으로 슈팅 게임은 클라가 먼저 이동하고
서버한테 후통보 하는 형태로 제작하게 됩니다. (아니면 렉이 너무 심하게 느껴지죠)
또한 MMO는 캐릭터를 5프레임 정도로 연산하면서 느릿느릿 처리하지만
FPS 게임은 꽤 자주 (ex. 24~30프레임 정도) 연산하면서 클라 위치를
같이 연산하면서 갱신해야 피격 판정을 맞춰줄 수 있습니다.

클라가 서버한테 본인 좌표를 알리는 주기는 60프레임까지는 아니라도
꽤 자주 (1초에 5~10번) 알려줘야 하며
이 때 캐릭터 위치와 바라보는 방향, 이동 방향 등의 정보를 포함하게 됩니다.
또한 이 정보를 다른 클라한테 뿌려서 시뮬레이션 할 때가 중요한데
어차피 이전에 받은 패킷 정보는 '과거'의 상태이기 때문에
그 위치로 바로 이동시키면 가위 눌리는 현상이 일어나게 됩니다.
따라서 일반적으로는 패킷을 보낼 때 바로 앞의 목적지를 찍어주고
각 클라 시뮬 단계에서는 해당 목적지를 향해 이동하게
클라 보정을 하면 비교적 자연스럽게 보정이 가능한데
이를 유식하게 [추측항법]이라고 합니다.

마지막으로 FPS 게임이라면 패킷 모아 보내기 등은 다 제거하고
최대한 빠르게 답변을 줘서 네트워크 반응 속도를 높혀야 합니다.
참고로 배그 같은 게임은 언리얼 데디 서버를 사용하는데
언리얼은 기본적으로 select 모드의 싱글쓰레드 서버를 사용하며
한 방 = 한 프로세스가 띄워지게 되고,
기억을 살리면 실제로 서버 또한 20 프레임 정도로 빠르게 돌았던 것으로 기억합니다.

근데 만드시는게 캐주얼 방식의 슈팅 게임이라고 하면
사실 배그처럼 정밀하게 자주 연산할 필욘 없으니
이건 테스트와 조정과 삽질이 많이 필요합니다.
저도 처음에 MMO 포폴을 만들 때 이동 동기화 때문에
저어어엉말 많은 헤딩을 했던 기억이 있는데
(60프레임 다 패킷 보내보기. 이동 방향 틀어질 때만 보내보기. etc .....)
그게 다 피와 살이 되는 경험이고 서버 붙일 때의 가장 핵심적인 부분이니 힘내시기 바랍니다!




질문답변 감사합니다 선생님

먹물크림빵님의 프로필 이미지
먹물크림빵

작성한 질문수

질문하기