네트워킹 탁구 복제


10

TCP 소켓, UDP 통신 등의 기본 사항이 있지만 실시간 게임 환경에 적용하는 방법에 대해서는 찾을 수 없습니다.

4 명의 플레이어가있는 Pong 복제본을 가지고 있으며 세 클라이언트와 서버 사이의 패들 위치를 동기화해야합니다 (서버가 네 번째 플레이어 임). 현재 UDP를 사용하여 실시간 업데이트 (패들 이동) 및 TCP를 사용하여 게임 로비 등을 설정합니다.

대량의 UDP 트래픽을 스팸으로 보내는 것이 나쁜 것입니까? 혼잡 기능에 대해 DCCP와 같은 것을 조사해야합니까? 아니면 이것이 소규모 프로젝트에서 실제로 문제가되지 않습니까?

클라이언트 / 서버간에 동기화 메시지를 언제 보내야합니까? 현재 서버는 현재 게임 상태에서 UDP 패킷을 관리 할 수있는 속도로 스팸으로 처리하고 있으며 클라이언트는 패들 위치를 가능한 한 빨리 서버로 스팸으로 보냅니다. 이것이 최선의 방법입니까? 메시지가 X 밀리 초마다 한 번씩 보내지도록 추가해야하는 지연이 있습니까? 아니면 이벤트가 발생할 때만 메시지를 보내야합니까? (예 : 사용자 입력으로 인해 패들 속도가 변경됨)

고객이 서로 대등하게 패들 위치를 통신하게하는 것이 더 좋을까요?

나는 Pong과 관련하여 이러한 질문을하고 있지만 다른 게임이나 일반 솔루션에서 이러한 문제를 어떻게 극복 할 수 있는지에 관심이 있습니다.


귀찮게, 게시 직후에 나는 이것을 보았다 : gamedev.stackexchange.com/questions/249/…
elwyn

답변:


5

업데이트 간격을 구성 할 수 있으므로 (초당 5 개 또는 20 개 패킷 조정 및 시도 가능) 각 프레임이 업데이트를 보낼 시간인지 확인하십시오. 간단한 이벤트로 각 이벤트에 패킷을 보내는 것이 좋을 수도 있지만 더 복잡한 게임에서는 실용적이지 않습니다. 또한 패킷 오버 헤드가 있으므로 여러 개의 작은 패킷을 보내면 대역폭을 낭비하게됩니다.

각 업데이트 간격마다 각 클라이언트가 해당 패들 위치를 서버 또는 각 클라이언트 (피어 피어)로 보냅니다. 서버가 볼 위치와 속도 벡터를 보내도록합니다. 각 클라이언트는 싱글 플레이어에서와 동일한 화면 그리기 코드를 실행할 수 있으므로 공의 움직임이 부드럽습니다. 멀티 플레이어에서는 서버 만 공을위한 위치 / 속도 업데이트를 규칙적인 간격으로 보내야합니다 (그리고 매번 무언가를 칠 때마다 마음에 드는 경우).

볼 위치 업데이트가 모든 클라이언트에서 게임 시간을 참조하도록하여 순서가 잘못된 패킷을 버리고 볼 위치의 보간을보다 정확하게 만들 수 있습니다 (과거의 특정 시간의 위치와 속도를 알고 있으므로 새로운 보간을 할 수 있습니다) 위치).

게으른 게임이있는이 모델을 사용하면 공이 때때로 뒤로 이동하거나 약간 뛰어 다니는 것을 볼 수 있습니다. 그러나 적절한 연결로 꽤 매끄러 워야합니다.


5

트래픽 문제와 관련하여 피어 당 초당 20-30 개 이상의 패킷을 보내지 않으려 고합니다. 일반적으로 더 작고 더 적은 수의 패킷을 보내면 지연 시간이 줄어들고 패킷이 손실 될 가능성이 줄어 듭니다.

플레이어가 차이를 알 수 없으므로 프레임 속도보다 빠른 속도로 업데이트를 보내고 싶지 않습니다. 실제로 초당 10 번 패킷을 보내고 수신 측의 결과를 보간 / 외삽하는 경우 대부분의 플레이어는 차이를 느끼지 못합니다.


4

이것은 꽤 광범위한 질문이지만 중요한 측면을 요약하려고 노력할 것입니다.

게임의 네트워크 코드에서 가장 먼저 결정하는 것은 피어 투 피어 배열의 클라이언트 / 서버 설정을 원하는지 여부입니다. RTS가 유일하게 눈에 띄는 예외 인 대부분의 게임은 아마도 클라이언트 / 서버 아키텍처를 사용하고있을 것입니다. 가장 큰 장점은이 배열이 내결함성이 뛰어나고 각 클라이언트가받는 데이터를보다 강력하게 제어 할 수 있다는 것입니다. 피어 투 피어는 훨씬 적은 양의 데이터를 전송할 수 있지만 각 피어가 다른 모든 피어처럼 정확하게 세상을 완전히 시뮬레이션해야합니다. 한 피어가 지연되거나 비동기 화되면 모든 사람이 복구 될 때까지 기다려야하거나 단순히 손실됩니다.

UDP는 일반적으로 모든 클라이언트 / 서버 모델에 대해 올바른 선택입니다. TCP는 P2P 게임에 실용적이지만 UDP조차도 더 나은 선택 일 수 있습니다. 기본적으로 UDP는 처리량이 적으므로 더 많은 노력을 기울이지 만 오류 처리 방법을보다 강력하게 제어 할 수 있습니다.

Pong에게있어서 제가 선택하는 것은 클라이언트 / 서버입니다. 액션 지향 게임입니다. 여기서 한 가지주의 할 점은 한 명의 플레이어가 "서버"라고 말하더라도 본질적으로 로컬 서버를 실행하고 클라이언트로 연결하도록 코드를 구성하는 것이 가장 좋습니다.

당신은 확실히 어떤 방향 으로든 "스팸 메일"업데이트를 원하지 않습니다. 프레임 당 서버에서 한 번만 업데이트하면 서버가 고정 프레임 속도로 실행되고 있어야합니다. 그것이 당신에게 달려 있지만, 배 밖으로 갈 필요는 없습니다. 50ms 프레임 (20 FPS)은 훌륭한 부드러운 게임 플레이를 위해 충분합니다. 클라이언트에서 원활하게 작업하기 위해 보간을 사용하려고합니다. 클라이언트는 서버 프레임 스냅 샷간에 지속적으로 전환해야하며, 이는 별도의 질문의 주제 일 수 있습니다.

클라이언트가 적절한 프레임 속도로 실행중인 경우 프레임 당 하나가 너무 많을 수 있지만 클라이언트 업데이트도 제한되어야합니다.


1

부정 행위에 관심이 있습니까?

그렇지 않으면 피어 투 피어로 이동하면 지연이 A <-> B <-> C 대신 A <-> C이므로 절반으로 줄어 듭니다. 그렇다면 동기화의 공평성을 위해 로컬 플레이어 또는 대부분의 게임에 대해 응답이 다소 지연 될 수 있습니다. 플레이어가 로컬에서 무엇이든 수행 한 다음 서버의 결과가 로컬에서 시뮬레이션 된 경우 다시 스냅하십시오.

탁구 복제는 실제로 약간 까다 롭습니다. 왜냐하면 대부분의 게임과는 달리 (개발자로서) 한쪽이 적중을 보도록 속임으로써 속임수를 쓸 수 없기 때문입니다.

일반화 된 것으로, 내가 들어 보았지만 필요하지 않은 한 가지 기술 (액션 게임 일 수도 있음)은 실제 타임 스탬프 (수신 시간-ping / 2)로 작업을 유지하고 서버를 롤백하는 것입니다 ( snap) 이전 이벤트가 발생한 경우 이후 조치를 다시 적용하십시오. 이렇게하면 플레이어의 상호 작용이 다르기 때문에 모든 갈등이 발생하지 않는 한 모두가 로컬에서 일관됩니다. 유일하게 위험한 것은 연결이 허술한 경우 '시간을 롤백'하는 능력입니다.


1

구글 데드 레커닝. 4 명의 플레이어에게 업데이트를 보내는 것은 중요하지 않습니다. 전송되는 데이터의 양은 바이트 순서입니다. 따라서 자주 업데이트해야합니다. 계산이 잘못되면 클라이언트와 서버에서 플레이어를 이동합니다. 서버가 권한입니다. 클라이언트 위치가 서버와 너무 멀어지면 다시 정렬되어야합니다. http://trac.bookofhook.com/bookofhook/trac.cgi/wiki/Quake3Networking UDP를 사용하는 것이 좋습니다. 손실 된 데이터가 곧 수신 데이터로 대체 될 수 있도록 Bupdate가 자주 전송됩니다. TCP의 패킷 재전송은 플레이어 입장에서 가치가 없습니다. 클라이언트와 서버를 동기화 상태로 유지하는 방법에 대한 자세한 내용은이 기사를 참조하십시오.


-1, 낮은 콘텐츠 [현재] 철자가 잘못되었습니다. 그것은의 추측 항법 (dead reckoning) .
Tetrad

내 downvote를 제거했습니다.
Tetrad

0

몇 주 전에 2 인용 로컬 네트워크 퐁 게임을 프로그래밍했습니다. 다음은 그 방법입니다.

-한 쪽은 서버를 열고 다른 쪽은 자동으로 연결합니다-둘 다 패들을 서로를 향하여 60fps 이하로 스패닝합니다 [UDP]-한쪽이 공을 때리면 공에 새로운 속도와 위치를 결정하고 전송합니다. 다른 쪽 [TCP]에게-공이 패들을지나 날아가는 경우, 공을 놓친 선수는 다른 쪽과 접촉하여 점수 증가 메시지를 받고 공이 재설정됩니다 [TCP]-공은 항상 독립적으로 시뮬레이션됩니다. 탁구의 간단한 공 물리에 적합

이것은 60fps에서 대략 0.3에서 0.5KByte / s의 트래픽을 생성하고 플레이어는 인식에 지체가 없지만 핑이 특정 임계 값 미만인 경우에만 볼을 새로운 위치로 전송해야하기 때문입니다.

또한이 시스템을 사용하면 부정 행위가 쉬우 며 연결이 매우 끊긴 연결과 동기화되지 않을 가능성이 높지만 누가 퐁퐁에서 부정 행위를 하는가?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.