Search
Write a publication
Pull to refresh
16
0
Send message

Забыл добавить. Библиотека поддерживает работу и с целочисленными типами.

Замечу, что типа int тут тоже много, достаточно short'а.

Приведу пару преимуществ использования float'а перед short'ом.

  1. Использование float удобно тем, что не нужно руками производить конвертацию каждый раз, когда понадобится использование дробного числа вместо целочисленного.

  2. Никто не отменял сценарий, когда нам понадобится изменить ограничения в большую сторону и, в связи с этим, мы перестаним влазить в short. Менять тип с одного на другой - не самое приятное удовольствие.

Готовой реализации нет. Но можно написать вот такой метод расширения:

Пример
public static class Extentions
{
    public static void WriteValue(this BitWriter writer, float baseline, float updated, float expectedDiff)
    {
        var defaultFloatPrecision = 0.000001f;
        var actualDiff = updated - baseline;
        
        if (Math.Abs(expectedDiff - actualDiff) < defaultFloatPrecision)
        {
            writer.Write(false);
        }
        else
        {
            writer.Write(true);
            writer.Write(updated);
        }
    }

    public static float ReadFloat(this BitReader reader, float baseline, float expectedDiff)
    {
        var isChanged = reader.ReadBool();
        if (isChanged)
        {
            return reader.ReadFloat();
        }

        return baseline + expectedDiff;
    }
}

Для рассчета дельты нужно использовать состояния миров, которые имеются у обоих участников коммуникации (клиента и сервера).

Например, текущий тик сервера равен 12 и он знает, что клиент подтвердил получение пакета с состоянием игры, которое соответствует тику номер 10. Тогда сервер может смело рассчитывать дельту на основе 10 и 12 тиков и отправлять эту дельту клиенту. Если, по какой-то причине, пакет теряется и на сервере наступает новый тик, то сервер будет рассчитывать дельту между 10 и 13 тиком.

Т.е. сервер должен рассчитывать дельту между состоянием миров для текущего тика и для тика, который клиент подтвердил получение.

Название и номера полей не записываются. Тут важен порядок записи и чтения, он должен совпадать.

Тут можно посмотреть внутреннюю реализацию чтения дельты на примере float.

Information

Rating
Does not participate
Registered
Activity

Specialization

Backend Developer, Game Developer