서버 측 입력


9

현재 내 게임에서 클라이언트는 렌더러 일뿐입니다. 입력 상태가 변경되면 클라이언트는 패킷을 서버로 보내고 플레이어는 입력을 처리하는 것처럼 플레이어를 이동하지만 서버는 그 위치에 대한 마지막 말을합니다.

이것은 일반적으로 가장자리에서 떨어지는 큰 문제 하나를 제외하고는 실제로 잘 작동합니다. 기본적으로 플레이어가 가장자리를 향해 걷다가 절벽이라고 말하고 가장자리에서 떨어지기 직전에 멈 추면 때로는 2 초 후에 가장자리에서 순간 이동됩니다. 서버가 정보를 처리 한 후 "W 누름 중지"패킷이 전송되기 때문입니다.

의미를 이해하는 데 도움이되는 지연 다이어그램은 다음과 같습니다. http://i.imgur.com/Prr8K.png

서버가 처리 할 수 ​​있도록 각 프레임마다 "W Pressed"패킷을 보낼 수는 있지만 대역폭 비용이 많이 드는 솔루션 인 것 같습니다.

도움을 주셔서 감사합니다!

답변:


5

서버가 입장에 대한 최종 결정을 내리는 동안, 클라이언트가 입력 및 위치로 전송 한 내용을 확인하고 온전한 상태를 확인함으로써이를 수행해야합니다. 나는 당신이하는 일이 즉시 플레이어를 움직이고 코드에서 생성되는 기대가 클라이언트가 실제 위치이기 때문에 이것을 말합니다.

일반적으로 잘 작동한다고 생각하지만 그렇지 않습니다. 참고 사항 : 클라이언트는 렌더러에 지나지 않는다고 말한 다음 즉시 서버 메시지없이 이동할 수 있도록 로컬 제어 권한을 부여하십시오. 두 가지 방법을 모두 사용할 수는 없습니다. 서버가 이동을 지시하거나 위치를 제어한다고 가정하고 서버를 사용하여 치트를 확인하십시오.

귀하의 답변이 1 초 동안 도달하고 있음을 알고 계십니까? 500ms의 대기 시간으로 모든 종류의 액션 게임에는 엄청나게 큽니다. 이 처리 시간이 오래 걸리는 이유를 알아보십시오. 명령 대기열에서 즉시 처리되지 않는 것부터 플러드 대역폭까지 또는 패킷 손실을 유발하는 데몬까지 발생할 수 있습니다.

내가 생각해야 할 것은

client sends a move + position update
server gets it t+latency time later
server verifies and sends out info to all clients
client receives this at (t+latency + latency)

여기서 까다로운 부분은 클라이언트가 자신에 대한 메시지를받는 경우 해당 메시지가 "잘못된 이동, 대신 XYZ로 이동"과 같은 경우가 아니라면 대부분 무시해야한다는 것입니다. 이 메시지가 다른 사람의 고객을 위해 정보를 얻고 있다면 시간을 앞뒤로 추정하여 메시지의 위치를 ​​파악해야합니다.


클라이언트는 그 위치를 전혀 보내지 않습니다. 단순히 예측 / 보간합니다. 그것이 가장자리에 있다고 생각할 때 가장자리에서 떨어지는 이유입니다. 또한 지연 시간이 1 초라고 말한 곳을 알지 못합니다. 인터넷을 통해 8ms (로컬 테스트)에서 100ms에 가깝습니다. 나는 정기적으로 전체 위치 업데이트를 전송하기 때문에 플레이어가 나중에 다시 설정되고 있다고 말했다. 클라이언트가 눌렀 던 키와 함께 있어야한다고 생각하는 위치를 보내야하며 서버가 가능한지 확인해야한다는 것을 이해하고 있습니까?
토마스

"때로는 잠시 후, 그는 순간 이동 될 것이다"는 큰 지연을 암시했다. 반응 형 액션 게임의 경우 예, 클라이언트가 재생되고 서버가 시간이 지나면 재생되어 불법적 인 일이 있는지 클라이언트에 알립니다. 온라인 멀티 플레이어 게임에서는 주로 다른 사람들이 서버에서 온 위치를 이동시키는 반면 자신의 위치는 서버 직접 수정으로 거의 변경되지 않는 것을 볼 수 있습니다. 다른 사람들은 당신이 위치 등 이동 참조 ...
Patrick Hughes

그래도 플레이어가 서버의 가장자리에서 떨어지지 않을 수 있습니까? 프레임마다 패킷을 보내지 않으면 서버는 플레이어가 약 32ms 동안 움직이고 있다고 생각할 수 있습니다. (3 프레임마다 패킷을 보냅니다). 또는 서버에서 입력을 전혀 시뮬레이트하지 않고 위치가 눌린 입력의 경계에 있는지 확인하는 것입니까?
토마스

서버는 클라이언트가보고 한 유효하지 않은 이동 만 수정하므로 클라이언트 자체가 가장자리를 바로 넘어 가지 않으면 "벼랑에서 떨어졌다"는 메시지를 보내지 않습니다. 이 피드백 루프에서 클라이언트는 세계에 대한 자신의 견해와 그의 위치에 맞게 스스로를 교정하는 서버입니다. 움직임은 플레이어에게 선명하고 반응합니다. 월드 객체와의 상호 작용과 같은 다른 작업에는 서버가 클라이언트에게 방금 일어난 일을 알리고 상자를 클릭하고 응답을 기다리는 것이 포함되지만 여기서는 움직임에 대해서만 이야기하고 있습니다.
Patrick Hughes

그것은 내가 현재하고있는 것과 매우 흡사합니다. 서버에 위치를 보내고 서버가 플레이어가 해당 위치로 이동할 수 있는지 여부를 확인하게합니다. 그것은 더 휴리스틱 접근법으로 보이지만 제 생각에 서버가 기간을 결정하는 것만 큼 효과적이지 않을 것입니다. 각 패킷과 함께 타임 스탬프를 보낼 수 있습니까? 나는 그것이 문제를 근절 할 것이라고 생각합니다. Halo와 소스 엔진을 사용하는 게임에서 사용한다고 생각합니다.
토마스

0

나는 당신이 다음과 같은 질문을 이해합니다 :

'전달'버튼을 누르기 시작하면 서버가 패킷을 가져오고 마지막으로 '전달'버튼을 놓으면 다른 패킷이 전송됩니다. 따라서 서버의 실제 움직임은 실제 게임에서 플레이어가 클라이언트 쪽에서 표현하는 것과 비교하여 약 100 밀리 초 '너무 늦게'시작되고 끝납니다. 따라서 플레이어가 10 초를 움직이려면 x >= 1온라인 위치 대신 10.x 초 이동하게 됩니다.

이는 플레이어가 의도 한대로 게임 세계에서 플레이어의 의사를 표현하지 않아 사용자 경험이 다소 나 빠지기 때문에 나쁜 디자인 전략입니다.

내가 권장하는 해결책은 플레이어가 몇 걸음 걸렸으며 어느 방향으로 진행되는지를 나타내는 패킷을 가능한 한 자주 보내는 것입니다. 그런 다음 서버는 정확성 검사를 통과하면 게임 세계를 새로운 플레이어 위치로 업데이트합니다. 따라서 플레이어는 매우 정밀하게 움직일 수 있고 높은 선반에서 떨어지지 않습니다.

대안은 지난 1 초 동안 플레이어의 위치를 ​​기억하고 버튼을 놓은 시간에 따라 위치를 수정하는 것입니다. 옛날의 고무 밴드 효과를 만드는 것처럼 들립니다. (다른 이유로 만)

따라서 기본적으로 어떤 버튼을 눌렀는지와 버튼을 눌렀을 때의 실제 게임 시간, 그리고 어떤 버튼을 놓았는지, 정확한 시간에 패킷을 보내야합니다.


Patrick에게 말했듯이 솔루션은 휴리스틱 접근 방식에 가깝습니다. 서버는 "The Man"대신에 클라이언트 데이터의 유효성을 검사합니다. 물론 지연이나 다른 네트워크 문제로 인해 오 탐지가 발생하지 않도록 약간의 여유를 만들어야합니다.
토마스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.