Я заинтересован в оценке различных способов, которыми сетевой код может «зацепиться» за игровой движок. Сейчас я разрабатываю многопользовательскую игру, и пока я решил, что мне нужно (как минимум) иметь отдельный поток для обработки сетевых сокетов, отличный от остальной части движка, который обрабатывает графический цикл и скрипты.
У меня действительно был один потенциальный способ сделать сетевую игру полностью однопоточной, а именно проверять сеть после рендеринга каждого кадра, используя неблокирующие сокеты. Однако это явно не оптимально, потому что время, необходимое для рендеринга кадра, добавляется к задержке сети: сообщения, поступающие по сети, должны ждать, пока не закончится рендеринг текущего кадра (и логика игры). Но, по крайней мере, таким образом, игровой процесс будет оставаться более или менее плавным.
Наличие отдельного потока для работы в сети позволяет игре полностью реагировать на работу в сети, например, она может отправлять обратно пакет ACK сразу после получения обновления состояния от сервера. Но я немного озадачен тем, как лучше общаться между кодом игры и кодом сети. Сетевой поток будет помещать полученный пакет в очередь, а игровой поток будет читать из очереди в соответствующее время в течение своего цикла, поэтому мы не избавились от этой задержки до одного кадра.
Кроме того, кажется, что я хотел бы, чтобы поток, который обрабатывает отправку пакетов, был отделен от того, который проверяет пакеты, поступающие по каналу, потому что он не сможет отправить один из них, пока он находится в середине проверка, есть ли входящие сообщения. Я думаю о функциональностиselect
или подобном.
Я предполагаю, что мой вопрос, каков наилучший способ создать игру для лучшей скорости отклика сети? Ясно, что клиент должен посылать пользовательский ввод как можно скорее на сервер, чтобы я мог сделать так, чтобы код net-send приходил сразу после цикла обработки событий, как внутри цикла игры. Есть ли в этом смысл?