2011-04-06 3 views
5

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

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

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

EDIT:

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

ответ

1

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

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

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

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

+0

Проблема, с которой я периодически сталкивалась, заключается в том, что я сохраняю двоичный файл. Я могу использовать режим Append для записи в файл, но он не воспроизводится должным образом; он останавливается в точке, в которой происходит первая запись, и после этого ничего не играет. Кроме того, я обнаружил, что прилагаемый файл был огромным. Это все еще очень много работает; Я просто пытаюсь сгладить изломы по одному. –

+0

Что-то вроде функции повтора - утомительная работа, потому что самые слабые ошибки испортили все остальное. Если у вас возникли проблемы с потоком и записаны на диске, чередуйте поток данных с метаданными и информацией об отладке, это поможет вам найти проблемы с обнаружением. Если вы очень хотите получить то, что вы вложили в этот поток, количество данных будет очень быстрым, это 60 FPS, но вам также нужно запустить цикл ввода игры с такой скоростью? Часто буферизованный входной подход с более низкой частотой дает столь же хорошие результаты, но при меньших затратах. –

+0

Система, которую я делаю сейчас, на самом деле является доказательством концепции, которую я собираю для своей диссертации. Метод записи, который у меня есть на минуту, отлично работает, но, очевидно, есть улучшения, которые можно было бы сделать и обсудить по этому вопросу. К сожалению, входная запись для повторов, по крайней мере, с точки зрения игры, немногочисленна и далека от того, что я нашел, были довольно расплывчатыми, так что я сильно колотил в темноте. Я посмотрю, как уменьшить скорость обновления игры; спасибо за идею. –

2

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

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

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

1

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

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

0

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

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

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

Смежные вопросы