데드레커닝 관련 질문입니다

문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족한 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 :
  • 프로젝트명 :
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :

안녕하세요.

데드레커닝 기법 사용 시 안내 글(뒤끝 개발자)을 읽었습니다.

예제게임 코드도 보았지만, 잘 이해가 가지 않는 부분이 있었습니다.
제가 이해한 바가 맞는지, 크로스체크를 부탁드리기 위해 질문으로 남깁니다.

이해한 바로는 아래와 같습니다

비호스트 : 클라이언트에서 처리하지 않고 서버 (호스트) 로 넘김. 그리고 다시 서버 (호스트) 로 부터 오는 소켓으로 클라이언트 로직 처리
호스트 : 자신의 처리는 소켓 보내지 않고 직접 처리 . 그리고 다른 사람들의 소켓을 받아 클라이언트 로직 처리.

1.그럼 호스트 자신의 이동 등 처리는 다른 비호스트 클라이언트들은 어떻게 처리하나요?
2.비호스트들이 보낸 소켓 처리를 어떻게 호스트가 다시 클라이언트로 그대로 전달하나요? 굳이 이럴필요가있나요?
3. 제가 이해한게 틀렸다면… 비호스트 / 호스트 간 처리를 소켓 / 로직 처리 별로 말씀해주실수있을까요?
감사합니다

안녕하세요 개발자님,
데드레커닝 기법은 네트워크 통신량을 줄이고 데이터의 정확도를 보장하는 기법입니다.

개발자님께서 작성하신 내용을 바탕으로 다시금 설명을 드리면

호스트

  • 자신의 변경 정보(키값)들은 전송하지 않고 내부에서 처리
  • 서버에 브로드캐스팅 된 메시지 중
    • 비호스트의 변경 정보(키값)를 받아 클라이언트 로직 처리
      → 이후, 처리된 값(★)을 서버로 전송하여 비 호스트들에게 브로드캐스팅

비호스트

  • 서버로 변경 정보(키값)를 전송
  • 서버에 브로드캐스팅 된 메시지 중
    • 비호스트가 보낸 메시지는 무시
    • 호스트가 보낸 메시지(★) 를 디시리얼라이즈를 수행하여 게임에 적용시키며 동기화

호스트가 보낸 메시지에는 호스트 및 비호스트들의 상태와 동기화 값이 들어있습니다.
비호스트 또한 클라이언트에서 연산을 수행하며 호스트가 보내는 메시지에 대해 동기화 하는 방식을 사용하게 됩니다.

비호스트들이 보낸 변경 정보(키값)를 호스트가 연산하여 클라이언트로 다시금 전달하는 것은
실시간으로 통신하지 않아 데이터 통신량을 줄이는 대신 떨어지게 되는 정확도를 높이기 위함입니다.

답변 감사합니다. 하지만 아직 궁금점이 해소되지 않아 추가 질문입니다.

그렇다면 예를들어,

왼쪽으로 한 칸 이동 이라는 키 값을 비호스트가 전송하였습니다.

그러면 왼쪽으로 한칸 이동을 호스트가 받아 처리 (한 칸 이동시킴) 하고,

한 칸이동 시킨 그 값을 비호스트들에게 보낸다는건가요? 그 결과는 좌표가 될 수도 있겠네요.

근데 이 좌표랑, 한 칸 이동시키는 키 값을 다시 비호스트 들에게 전달해서, 비호스트들이 연산하도록 하는 것이랑 무엇이 다른가요?

즉, 호스트가 받은걸 처리해서 결과물을 비호스트들에게 주는 것과,
호스트가 받은걸 그대로 비호스트들에게 주는 것의 차이를 모르겠습니다.

또한 한 칸 옆으로 이동이라는 예시의 처리 결과물 전송은 쉽지만,
호스트에서 키값 처리의 결과가 velocity 변경 처리라면, 이 처리를 어떻게 비호스트들에게 전달해서 처리해야할지 모르곘습니다.

안녕하세요 개발자님.

뒤끝매치의 경우, 결과물을 주지 않고 동작 시작을 기준으로 데이터를 전송했습니다.

  • 유저가 컨트롤러를 이용해 방향을 지정하고 움직이기 시작할때 움직이려는 방향과 현재 좌표를 전송
  • 컨트롤러에서 손을 땠을 때에는 현재 좌표와 움직임이 멈췄다는 isMove = false 전송
  • 총을 쐈을 때에는 총알의 방향을 전송
    결과를 처리해주는 것은 각 각 클라이언트의 차이로 인해 판정이 애매해질수도있는 캐릭터의 피격이나 승리같은 결과만 해당됩니다.
    호스트를 중심으로 이용한 것은 유저2,3,4의 기기 처리 속도나 와이파이 속도가 달라 메세지 받는 시간에 차이가 점점 생겨 게임 내용에 큰 차이가 생길 수도 있기에 이것을 중재해주고자 호스트에게 한번 보내도록 했습니다.

1대1 같이 유저가 적고 상호작용이 확실한 경우에는 호스트의 중재없이 바로 적용해도 무관합니다.

velocity의 경우에도, Vector3 vecocity = new Vector3(xMove, 0, zMove) * speed; 처럼 사용한다면 xMove,zMove,speed의 변경이 이루어졌을 경우에 좌표의 값(클라간 달라졌을 수 있는 좌표의 값을 맞추기 위해)과 값이 변경되었다는 메세지를 전송하는 것을 권장드립니다.

좋아요 1