Как устроен игровой протокол передачи данных?

Добрый день/вечер/ночь.

Интересует вопрос: как работают сокеты у игр?
Взять для примера игру CS:GO, ведь там ежесекундно отправляется over9000 пакетов данных, каким образом их пакует клиент и читает сервер?
Пакует ли клиент каждый пакет через новый экземпляр класса для упаковки? Читает ли каждый пакет сервер через новый экземпляр класса для чтения? Либо это все происходит через 1 класс?
Прошу подсказать.

Спасибо.
С наступающим Вас.
  • Вопрос задан
  • 6173 просмотра
Пригласить эксперта
Ответы на вопрос 3
@MarkusD
все время мелю чепуху :)
https://habrahabr.ru/post/209144/
https://habrahabr.ru/post/209524/
https://habrahabr.ru/post/213559/

Оригиналы:
web.archive.org/web/20190328001900/https://gaffero...

Дополнительные материалы:
web.archive.org/web/20190328001900/https://gaffero...

По этому поводу, в целом, советую почитать блог Гленна Фидлера.

Так же есть удобные библиотеки, которые сами собой отвечают на остальные твои вопросы:
https://developers.google.com/protocol-buffers/
https://capnproto.org/
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
И Вас, с наступающим!
Вот хороший ресурс и статейка на русском: что и как работает и почему.
https://developer.valvesoftware.com/wiki/Source_Mu...
Ответ написан
Rou1997
@Rou1997
игру CS:GO, ведь там ежесекундно отправляется over9000 пакетов данных
Даже космическая ракета вряд ли ежесекундно отправляет over9000 "пакетов" телеметрии. :)
Ни клиент CS:GO, ни сервер CS:GO на один сокет, и близко столько не передает и не принимает, какие-то тысячи можно насчитать только если пакетами считать TCP/UDP-сегменты, но это уровень ОС, а вас интересуют не эти пакеты, а буферы byte[], и если скажем подсчитать вызовы Berkeley's send() в секунду то не будет и сотен и даже десятков может не быть.
Собственно весь TCP-поток игры вы можете посмотреть с помощью сниффера, но вы же не дружите с инструментами отладки как я помню, поэтому можете еще пару нулей дописать к числу в вашей фантазии. :)

Пакует ли клиент каждый пакет через новый экземпляр класса для упаковки?
Разумеется, да, как и с HTTP-запросами, классы вроде System.Net.HttpWebRequest в принципе являются моделью данных пакета вроде POGO, а всю "грязную работу" с буфером byte[] класс берет на себя, это повсеместная практика что за вопросы.

Читает ли каждый пакет сервер через новый экземпляр класса для чтения?

Аналогично.

Либо это все происходит через 1 класс?

Да вообще всю игру пишут в одном классе а новый класс создают только когда IDE вместо номеров строчек начинает выдавать числа с экспонентой!
Попробуйте написать просто надежный клиент-сервер без всякого payload и обойтись 1 классом там и там, мой первый был именно таким и это ужас, хотя кому я...)))

С наступающим Вас.

Если только с наступающим трудовым днем, я завтра работать буду в отличие от таких как вы.))))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы