2015-02-01 2 views
1

첫 번째 네트워크 게임에서이 점을 자세히 읽으면서 TCP v UDP에 대해 보장 된 배달과 배달 시간의 핵심 차이를 이해합니다. 또한 실시간 게임이 UDP 또는 TCP를 사용해야하는지에 대해 정 반대 의견을 읽었습니다. ;)실시간 게임에서 네트워크 패킷 손실 처리 - TCP 및 UDP

아무도 제대로 다루지 않은 것은 떨어 뜨린 패킷 문제를 처리하는 방법입니다.

TCP : TCP 만 사용하여 권장되는 FPS에 대해 TCP를 사용하여 기사를 읽습니다. TCP 클라이언트 입력을 사용하는 신뢰할 수있는 서버가 패킷 손실을 처리하고 갑작스런 서사시가 지연되는 것을 어떻게 피할 수 있습니까? 게임이 잠시 멈추고 중단 된 부분을 집어들나요? TCP 패킷 손실이 너무 드물기 때문에 TCP를 통한 FPS와 FPS가 실제로 잘 작동하지 않습니다.

UDP : 다른 문서에서는 UDP 만 사용하는 것이 좋습니다. 분명히 "던진 수류탄"과 같은 원샷 UDP 이벤트는 시간이 오래 걸리지 않기에 충분히 안정적이지 못합니다. 메시지 수신, 수동 재전송 프로토콜을 구현해야합니까? 아니면 다른 해결책?

내 게임은 서버에서 클라이언트 및 로컬 시뮬레이션에 이르기까지 1/10 초 업데이트 된 틱 기반의 신뢰할 수있는 서버로 더 많은 응용 프로그램에 적용 할 수 있습니다.

답변

1

나는 실시간 TV 편집 시스템을 만들었습니다. 모든 실시간 통신은 UDP를 통해 이루어졌지만 실시간이 아닌 TCP는 더 간단합니다. UDP를 사용하여 매 프레임마다 상태 패킷을 보냅니다. 예 : start video in 100 frames, 99,98,…3,2,1,0,-1,-2,-3 그래서 -3까지 메시지가 도착하지 않더라도 수신자는 아무도 눈치 채지 않기를 바라며 4 번째 프레임에서 시작하고 (여기서는 처음 3 개를 건너 뛰기 만합니다.) 여기에서부터 뒤 떨어진 것보다 낫다는 것을 알고 있습니다. 아무도 알 수 없으므로 약 + 1/4 초의 카운트 다운을 추가했습니다. 이렇게하면 떨어지는 프레임이 거의 없습니다.

요약하면 모든 프레임에서 동일한 상태 패킷을 보냈습니다. 여기에는 과거, 현재 및 미래 사건에 대한 모든 실시간 데이터가 포함되었습니다.

트릭은이 데이터 세트를 작게 유지합니다. 따라서 play button pressed 이벤트 (언 바운드 숫자가 있음)를 보내는 대신 video-id, frame-number, start-mask 및 end-mask를 보냅니다. (시작/정지 마스크는 프레임 번호이며, start-mask가 양수이고 stop-mask가 음수이면 프레임 프레임 번호에 비디오 표시).

이제 우리는 비디오가 멈추거나 다른 순간에 비디오를 시작할 수 있어야합니다. 그래서 우리는 얼마나 많은 연속적인 비디오가 동시에 재생 될 수 있는지를 고려합니다. 각각을위한 슬롯이 필요하지만 즉시 재사용 할 수 있습니까? 우리가 멈춤을 누른다면, 그때까지 멈춤 마스크를 알지 말고, 슬롯을 다시 사용하면 비디오가 멈 춥니 다. 음,이 비디오를위한 슬롯이 없어서 멈추어야합니다. 그래서 예, 고유 한 ID를 사용하는 한 슬롯을 즉시 재사용 할 수 있습니다.

기타 도움말 : +1 이벤트를 보내지 말고 현재 합계를 보냅니다. 플레이어가 약간의 합계를 업데이트해야한다면, 각각이 자신의 합계를 가져야하고, 사용 시점에서 모든 합계를 합산하지만, 다른 사람의 합계를 수정하지 않아야합니다.