예제게임 데드레커닝 문의입니다.

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

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

안녕하세요. 뒤끝 예제게임 튜토리얼과 유니티 튜토리얼 게임을 합쳐 pvp게임을 만들고 있는 학생입니다.
데드레커닝 기법이 사용되었다하여 소스를 살펴본 결과 도저히 제 실력으로는 찾을 수 없어 이렇게 문의 남깁니다. InputManager에서 GameManager.InGame(Coroutine)을 통해 계속해서 SendDataToInGame호출 하는것으로 보이는데 어느 부분을 봐야될까요?
제가 소스를 읽어 본 결과, 호스트 로컬에서 처리 후 브로드캐스팅하여 비호스트가 동기화하는 것이나, 비호스트 자체에서 처리하고 실시간으로 자신의 위치정보를 브로드캐스트하여 접속 된 모든 유저가 동기화하는것이나 송수신 데이터양이 동일해 보입니다만…

안녕하세요 개발자님.

일반적으로 실시간 게임을 처음 개발하시는 분들은 대부분 매 프레임마다 자신의 좌표를 서버에 전송하여 동기화를 맞추는 것이라고 생각합니다.

하지만 이 경우에는 60프레임이면 1초에 60번의 데이터가 전송되고 받아야하기 때문에 게임에 무리가 갈 수 있습니다.

데드래커닝은 이러한 무리를 줄이고자 플레이어가 입력했을 때 입력한 값, 이동하려는 방향과 속도만 알려주고 이동은 클라이언트에 맡깁니다.(이동을 멈출 경우에는 멈췄다는 메세지만)

따라서 데드래커닝을 찾는 것이라면 특정 로직이 아니라 SendDataToInGame가 호출되는 시점과 처리 부분을 보는 것이 더 정확합니다.


호스트가 모든 값을 받아서 처리하는 것은 각 클라이언트간 동기화를 맞추고 게임간 차이가 발생하는 것을 최소화하기 위해서입니다.

와이파이의 속도 문제등으로 A클라이언트는 바로 받고 B클라이언트가 0.5~1초뒤에 받아서 처리하면 점점 클라이언트간 좌표에 차이가 생길 수 있기 때문에 이부분을 최대한 맞추기 위해서 호스트가 최대한 차이를 맞추고 부담을 덜고자 처리하도록 되어 있습니다.

개발자님이 말씀하신 대로 각 클라이언트가 메세지를 보냄과 동시에 로컬에서 처리를 하는 것 또한 문제되지 않습니다.

호스트가 입력에 대한 처리를 한번 더 하는 것은 클라이언트의 차이가 벌어지는 것을 최소화하기 위함이지만 입력에 대한 약간의 딜레이가 더 들기 때문에 이부분은 원하시는 대로 구성해주시면 될 것 같습니다.

먼저 빠른 답변 정말! 감사드립니다.

SendDataToInGame이 호출 되는 시점이 인풋이 일어날 때, 그리고 월드매니저의 OnReceiveForLocal()에서 처리할 때라 판단했습니다. 그리고, 비 호스트가 메세지를 처리하는 부분은 월드매니저의 OnReceive()에서 처리되는 것이라 판단했습니다. 혹시 더 확인해야하는 곳이 있을까요?

두번째 제 질문을 좀더 자세히 설명하자면, 현재 예제게임에서는 모든 유저들의 인풋매니저에서 게임매니저 코루틴에 의해 매 프레임마다 서버에 전송되는 것으로 보이며, 이를 호스트가 받아 다시 재가공 후 비호스트가 받을 메세지를 서버에 전송하는 것으로 판단됩니다. (모든게 매 프레임마다…)

호스트에서 가공하는 이유를 설명해주셔서 너무 감사드리오나, 제가 정말 궁금한 것은 매 프레임마다 들어오는 키 메세지들을 로컬에서 처리 후 다시 매 프레임마다 타입 메세지로 각 클라에게 브로드캐스트해주는 것처럼 보이는데, 이게 데드레커닝기법이 적용된게 맞는지 너무 궁금해서 여쭤 본거였습니다…

데드레커닝이라하면 어쩔 땐 보내고, 어쩔 땐 보내지 않는 소스 구성이 있어야되는 거 아닌가요…?

다시 한 번 시간내주셔서 답변 내주시면 정말 감사드리겠습니다 ㅠㅠ

먼저 빠른 답변 정말! 감사드립니다.

SendDataToInGame이 호출 되는 시점이 인풋이 일어날 때, 그리고 월드매니저의 OnReceiveForLocal()에서 처리할 때라 판단했습니다. 그리고, 비 호스트가 메세지를 처리하는 부분은 월드매니저의 OnReceive()에서 처리되는 것이라 판단했습니다. 혹시 더 확인해야하는 곳이 있을까요?

두번째 제 질문을 좀더 자세히 설명하자면, 현재 예제게임에서는 모든 유저들의 인풋매니저에서 게임매니저 코루틴에 의해 매 프레임마다 서버에 전송되는 것으로 보이며, 이를 호스트가 받아 다시 재가공 후 비호스트가 받을 메세지를 서버에 전송하는 것으로 판단됩니다. (모든게 매 프레임마다…)

호스트에서 가공하는 이유를 설명해주셔서 너무 감사드리오나, 제가 정말 궁금한 것은 매 프레임마다 들어오는 키 메세지들을 로컬에서 처리 후 다시 매 프레임마다 타입 메세지로 각 클라에게 브로드캐스트해주는 것처럼 보이는데, 이게 데드레커닝기법이 적용된게 맞는지 너무 궁금해서 여쭤 본거였습니다…

데드레커닝이라하면 어쩔 땐 보내고, 어쩔 땐 보내지 않는 소스 구성이 있어야되는 거 아닌가요…?

다시 한 번 시간내주셔서 답변 내주시면 정말 감사드리겠습니다 ㅠㅠ

1번은 이해하신 바가 맞습니다.

2번의 경우, 데드레커닝은 인풋을 받는 순간입니다.

예전에 언급했듯이 실시간 개발을 처음 접해보시는 분들의 기본 로직은 보통 자신의 트랜스폼을 매 프레임마다 보내는 것입니다.

뒤끝매치에서 데이터를 전송하는 방식은 인풋을 받을 때만 발생을 가며, 가끔씩 동기화를 위해 좌표를 자체를 보내주기도 합니다.

뒤끝매치에서도 왼쪽 이동컨트롤러를 조금이라도 움직일 경우 메세지가 계속 보내질 것이며, 아예 컨트롤러를 터치하지 않으면 지속적으로 좌표를 맞춰주는 코루틴을 제외하고는 보내는 메세지는 없습니다.

반면 매 프레임마다 자신의 트랜스폼을 송신한다면 입력 상관없이 계속 메세지가 매번 1초당 60번의 송신이 지속적으로 이루어질 수 있습니다.

쉽게 이해하시려면 다음과 같이 이해해주시면 감사하겠습니다.

매 프레임마다 자신의 좌표를 송신 → 자신의 방향이 바뀔때마다 방향을 송신 + 지속적인 동기화를 위해 가끔 송신

좋아요 1

알려주신 토대로 다시 읽어본 결과 이해했습니다. 정말 감사합니다!