дельта-сжатие с использованием протокольных буферов - PullRequest
3 голосов
/ 24 августа 2011

Я работаю над многопользовательскими кадрами в секунду, и я думаю о том, как выполнить дельта-сжатие объекта игрового состояния.

Читая о том, как Q3 организовал сетевое взаимодействие, я думаю, что дельта-сжатие может быть достигнуто путем сериализации объекта в двоичное состояние и последующей отправки только двоичной разницы между последним известным полученным объектом и текущим объектом.Это правильный способ обработки дельта-сжатия?

1 Ответ

1 голос
/ 24 августа 2011

Ну, у вас есть два варианта.

  • Вы можете сериализовать состояние A и состояние B и запустить результаты сравнения. (Как вы описываете).

или

  • Вы можете использовать знание структуры, чтобы найти разницу между состоянием A и состоянием B и сериализовать структурную разницу.

Что сводится к этому - структура данных определена таким образом, что взятие дельты быстрее, чем выполнение различий общего назначения?

Я верю, что это часто так. Давайте возьмем простой пример. Наш игровой мир определяет два элемента P1 и P2 (они бегают по всему миру) в любой момент времени, когда игровое состояние определяется как P1 (x, y, z) и P2 (x, y, z). Таким образом, структурная дельта - это разница между 6 переменными (x, y, z для двух игроков). Вычислить это быстро - это 3 математических операции. Тем не менее, кто знает, как они будут сериализованы - и тогда программе diff придется проделать большую работу (по крайней мере, один цикл), чтобы найти дельту результата.

Но это становится даже лучше, чем это. Поскольку ваш игровой движок знает, что вы заботитесь о дельтах по мере изменения ситуации, он может хранить дельты в списке и быть готовым отправлять дельты без каких-либо вычислений (например, каждый раз, когда P перемещает, он сохраняет изменения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...