Можно ли передавать сериализованные данные в файл с плоскими буферами?

Я делаю онлайн-игру в node.js и пытаюсь сохранить повтор игры на своем игровом сервере. Я использую плоские буферы для сериализации данных для связи клиент-сервер, и я подумал, что было бы здорово сохранять состояние моей игры кадр за кадром в файле.

Я создал следующую таблицу в моем файле .fbr

table Entity {
    id: ushort;
    pos: Vec2;
}

table Frame {
    entities: [Entity];
}

table Replay {
    frames: [Frame];
}

Есть ли способ записать все кадры состояния игры в файл на лету? Я знаю, что могу просто буферизовать N кадров и сохранить их в отдельных файлах воспроизведения, но я чувствую, что должен быть лучший способ. Я хочу, чтобы мой реплей был в одном файле, иначе потом пользоваться им будет очень неудобно.


person George    schedule 20.01.2020    source источник


Ответы (1)


Лучший способ сделать это — убедиться, что каждый отдельный FlatBuffer является «буфером с префиксом размера» (у него 32-битный размер впереди фактического буфера), который в JS вы можете создать, вызвав это вместо обычной функции finish : https://github.com/google/flatbuffers/blob/6da1cf79d90eb242e7da5318241d42279a3df3ba/js/flatbuffers.js#L715

Затем вы записываете эти буферы один за другим в открытый файл. При чтении, поскольку буферы начинаются с размера, вы можете обрабатывать их один за другим. Я не вижу никаких вспомогательных функций для этого в JS, поэтому вам, возможно, придется сделать это самостоятельно: прочитать 4 байта, чтобы узнать размер, затем прочитать байты размера, повторить.

person Aardappel    schedule 20.01.2020
comment
На самом деле генератор кода создает getSizePrefixedRootAsReplay() метод. Но его код является точной копией getRootAsReplay(). Является ли JS API незавершенным? - person George; 21.01.2020
comment
@ Джордж, да, они были только что исправлены на github.com/google/flatbuffers/pull/5717 - person Aardappel; 21.01.2020