네트워킹 탁구 복제


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.