Для реализации клиентского прогнозирования.
Буферизация
Буферизация дает вам повышенную стабильность, потому что симуляция всегда будет отставать от данных, которые вы получаете. Таким образом, вы никогда не исчерпаете данные, которые будут использоваться для симуляции на принимающей стороне. Естественным следствием этого является небольшое увеличение задержки. При хорошей эвристике (буфер правильного размера) симуляция никогда не будет догонять буфером, т.е. синхронизация никогда не будет блокироваться, если сам канал связи не станет нестабильным в течение более длительного периода времени. Это может быть внезапное изменение доступной полосы пропускания, потеря пакетов, сильно увеличенная задержка и т. Д. Вы также можете использовать примитив синхронизации, который блокируется по тайм-ауту, скажем, 1 мс. Когда происходит тайм-аут, вы можете использовать экстраполяцию вместо интерполяции (см. Ниже), отказаться от обновления всех отсутствующих состояний и обновлять только то, что обрабатывается клиентским предсказанием (если есть), или отказаться от обновления чего-либо до тех пор, пока вы не свяжетесь с снова удаленная сторона.
Имитация петли развязки
Ваше моделирование должно производить выборку с постоянной частотой. Выделив симуляцию из рендеринга, вы можете рендерить на более высокой частоте, чем симуляция для выборки. Например, ваша симуляция может работать со скоростью 30 кадров в секунду, но вы все равно можете выполнять рендеринг настолько быстро, насколько позволяет ваша видеокарта, например, 300 кадров в секунду. Это означает, что вам нужно отправлять меньше данных по сети, но без ущерба для качества анимации.
Сохранить пропускную способность, интерполировать между выборками
Плавная интерполяция между двумя выборками вместо обработки данных как абсолютных. И примером могут быть позиции игрока в игре. Если вы просто перемещаете или привязываете позицию игрока, используя вектор напрямую, вам понадобится какая-то безумно высокая частота дискретизации, которая затопит вашу сеть. Используя линейную или кубическую интерполяцию между двумя или тремя точками соответственно, вы получаете плавное движение, но с очень небольшим количеством точек выборки. Это, конечно, требует, чтобы точка интерполировалась до , так что это увеличит задержку на одно дельта-время, т. Е. Ваш временной шаг.
Резюме
РЕДАКТИРОВАТЬ: Хорошо, так как эти понятия напрямую связаны с вашей проблемой ? Ваша проблема - проблема дизайна; вы просто просто подаете данные непосредственно на симуляцию и рендеринг, когда они поступают по проводам. Использование мьютекса, у которого функция wait()
имеет тайм-аут, устраняет проблему блокировки, но не приводит к нехватке данных. Некоторые задержка лучше, чем частые тайм-ауты. Вот почему я рекомендую реализовать буферизацию и уменьшить использование полосы пропускания до нормального уровня.
Отправляйте только столько данных, сколько вам нужно, чтобы получить результат, который достаточно хорош . Отзывчивый и эстетичный.