• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

두가지 질문이 있습니다.

23.10.24 15:45 작성 조회수 222

0

●제가 서버의 대한 이해도가 완벽하지 않아, 제 의견이 들어가는 부분엔 문장 앞에 '●' 넣도록하겠습니다. 틀리다면 지적 부탁드리겠습니다.

 

어제 GroundObject[]를 사용해서 맵충돌은 결국 이동동기화 강의의 맵타일추출을 인용하여 진행하였습니다.

내가 가려고하는 방향의 앞타일을 가져와 갈수 있는곳인지 없는 곳인지를 판단하여 캐릭터를 이동하였습니다.

 

서버에서 체크하여 BroadCast하였습니다.

그 결과물입니다.

 

https://youtu.be/tjzA_VzAKb0

 

※Map 수정

 

※room.HandleMove 수정

 

  1. 해당방법은 괜찮은 방법인지 여부와

 

  1. 영상에 보시면 패킷전송량이 어마어마 합니다.

     

    실제로 Client에서 패킷 전송량을 보자면

     

     

     

    누르고 있을 때마다 패킷을 전송하게 되겠죠.


    (Dir의 _update 의해서 )

 

●"현직에 있을때 Photon 서버로 게임을 만든적이 있는데 클라는 최소한의 패킷 전송으로 최대한 많은 결과물을 받아야 한다고 생각하고 있습니다."

 

고작 내 포지션에서 스피드만큼 거리를 가려고 엄청나게 많은 패킷을 보내고 있습니다.

 

●또한 이 많은 전송량을 처리하려고 TickRoom을

16ms (60fps)로 설정 하였으니 서버에 좀더 과부화가 오지 않을까 생각합니다.

 

 

  1. 저렇게 실시간으로 움직여야 하는 방식에서 더 좋은 방법이 있는지 알고싶습니다.

답변 1

답변을 작성해보세요.

0

여기부터는 질문할 영역이 아니고 스스로 고민 & 헤딩을 통해 답을 얻어야 합니다.
특히나 현업 경험이 있으시다면 더욱 더 그렇습니다.
애당초 이 부분은 정확한 답이 있지는 않고 정말 프로젝트마다 구현이 다른데요.
그리드(칸) 단위의 게임이 아닌 경우, 장르마다 다르긴 하지만
MMO의 경우 1초에 5번 정도 패킷 교환을 통해 움직임을 맞추는 것이 일반적입니다.
당연히 실시간으로 모든 좌표를 보내면 안 되고 키보드 값이 바뀌어 방향이 틀어질 때 등
급박한 상황에서만 즉시 전송하고, 그게 아니라면 0.2초 마다 전송하는 식으로 많이들 합니다.
서버 또한 60 프레임에 매 번 돌 필요는 없고
서버 구조와 여러가지가 엮여있긴 하지만 네트워크 패킷 조립이 완성될 때
실행까지 담당하게 만드는 것이 장기적으로는 괜찮습니다.
그렇게 하기가 힘들다면 지금처럼 프레임을 높이는 것도 방법이긴 하나
그 방식은 FPS, MOBA 같은 장르라면 몰라도 MMO에서는 사용이 애당초 불가능합니다.

박정현님의 프로필

박정현

질문자

2023.10.24

클라 현직이였습니다...;; 일단 이동 동기화 강의중에 MMO와 FPS는 클라가 먼저 움지이고 서버에 알려주는 형식으로 말씀하신것이 있어 바꿔보도록 하겠습니다.

그런 관점에서 현업 말씀을 드린 것이 아니구요.
보통 학생들은 정해진 답이 있는 경우가 많다고 오해하는데
실제로 현업에선 그렇지 않고 정말 땜빵 코드가 많기 때문에 그 말씀을 드린 것입니다.


이동 동기화는 정말 답이 정해진 부분이 없고
장르에 따라서 노하우와 보정의 영역으로 넘어가기 때문에
아주 다양한 방법론이 있고 저도 이동 동기화 부분에서
헤딩을 정말 오래 했고 코드를 봤지만
결론은 케바케로 다르다입니다.

다만 정말 슈퍼 마리오 같이 좌표 동기화가 치명적으로 중요한
게임이라면 서버도 20프레임 이상으로 도는 것도 필요할 수 있습니다.

박정현님의 프로필

박정현

질문자

2023.10.25

클라만 한다면 1+1 = 2고 2+0 =2 3-1 =2 인것은 잘 알고 있습니다..


서버와 함께하다보니 뭐가 효율적인가를 물어보는 질문이였습니다.

일단 강의에서 말씀하신것도 위 질문에 답변주신것을 종합하여

생각해낸것은

 

이동하기전 서버로부터 Player의 위치를 받아오고 적용시킨후 (최초 1회 패킷전송)

클라 맵에서 1차 체크하여 이동가능 여부를 확인하고

(클라 변조후 이동가능성 때문에)

적용시킨 포지션에서 선 이동 후 서버통보하여 (0.2초마다 통보 패킷전송)

※캐릭터가 다른행동을 한다면 (ex)State, Dir) 바꾼다면 즉시 통보

서버에서 2차 맵을 체크 후

1.이동 가능하다면 서버 Player에게 이동한 포지션을저장 후

다른 클라에게 BoradCast를 방식으로 진행하였습니다.

 

  1. 불가능하다면 현재 서버 Player저장되어있는 포지션을

     

    클라이언트 세션에게만 전송 하였습니다.

     

 

 

BoradCast를 받은 RemotePlayer들 Posinfo를 받아

해당 포지션까지 Vetor3.MoveToWard로 이동시켜 놓으니

1초에 4~5번정도로도 이동 패킷 오갈수 있엇습니다.

 

항상 이런질문 많이 받으셔서 힘드셧을텐데

그래도 꼭 찝어주셔서 감사합니다.

 

강의 잘듣고있습니다. 감사합니다.