Способ избежать потери памяти - PullRequest
5 голосов
/ 06 апреля 2011

В настоящее время у меня есть система, в которой я записываю состояние геймпада в структуре и сохраняю его в списке состояний, чтобы записать ввод для продолжительности видеоигры. Полное состояние колодки занимает 192 бит на кадр, но это немного расточительно. Например, если аналоговые триггеры на пэде не нажимаются, они все равно занимают 32 бита, каждый в памяти. Поэтому, очевидно, я хочу сэкономить место.

Я пытался установить для этого параметра значение NULL, но, похоже, оно не влияет на размер двоичного файла, который система сохраняет в конце матча.

Какие альтернативы доступны в ситуации, когда вам нужно только записать или сохранить определенные значения, но сохранить целостность структуры данных?

EDIT:

Я думаю, что нашел решение; сортов. Ранее я пытался установить значения в NULL, переопределив стандартный float с System.Nullable в структуре. Моя идея состоит в том, что установка этого значения в NULL в структуре будет сериализоваться намного меньше. У меня сложилось впечатление, что NULL записывается как 4 бита. Это может быть больше, это возможно. Во всяком случае, код, который у меня был ранее, имел довольно очевидную ошибку, поэтому я вернулся и исправил ее снова. Теперь я получаю намного меньшие повторы, и точность, кажется, такая же хорошая, поэтому я собираюсь предположить, что обман NULL делает что-то правильно.

Ответы [ 4 ]

2 голосов
/ 06 апреля 2011

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

Например (очень грубый и непродуманный) (ЧТО 3xough):

Первый байт содержит состояние 8 кнопок, по одному биту для каждогокнопка.Если бит для кнопки установлен в 1, клиент (я пока называю его клиентом) ожидает более конкретные данные для этой кнопки, например направление и тому подобное, в определенном порядке.

1 голос
/ 06 апреля 2011

Это то, что вы делаете.

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

Таким образом, что-то вроде вектора может быть уменьшено до 3ноль бит.Если вектор пуст / ноль.Если допустим только один компонент вектора, то это 3 бита + только размер этого компонента.Вдобавок к этому вы, конечно, можете добавить сжатие, однако в какой-то момент распределение битов (когда вы разбираетесь в этом) становится очень равномерным.Это делает методы сжатия общего назначения менее оптимальными, и они могут даже увеличить размер вашего вывода.

И что вы делаете, это то, что вы периодически записываете эти вещи на диск, так что вы никогда не сохраняете огромный кусокэто в памяти.

1 голос
/ 06 апреля 2011

Возможно разделить вашу структуру и / или использовать сжатие.

Но главная экономия может состоять в том, чтобы сохранить во время игры, а не все в конце.

0 голосов
/ 07 апреля 2011

Вы могли бы хранить только дельты, может быть?Во многих ситуациях это дает хорошее сжатие.

Для ваших состояний типов битов он не меняет размер, а только означает.

Для ваших типов с плавающей запятой в большинстве случаев он уменьшается до 1 бита и увеличивается только на 1 битдругие дела.

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