Я на стадии планирования создания боевой игры и не уверен, как справиться с одной проблемой, связанной с памятью.
Справочная информация:
- Все еще обсуждается, следует ли использовать С# (XNA) или С++. Мы не хотим делать это до тех пор, пока не выясним, как решить эту проблему на обоих языках.
- Использование максимальной памяти 256 МБ было бы здорово, если это возможно.
- Два символа будут присутствовать одновременно, и эти персонажи могут только переключаться между битвами. Есть время, чтобы загрузить/освободить память между битвами, но игра должна запускаться с постоянной 60 кадров в секунду во время боя. Каждый кадр составляет 16,67 мс
- Общее количество изображений на одного персонажа находится на низких сотнях. Каждое изображение составляет примерно 200x400 пикселей. В любой момент времени будет отображаться только одно изображение с каждого символа.
Без сжатия, каждое изображение занимает примерно 300 кбайт от моих вычислений; до 100 МБ для целого персонажа. Это слишком близко к пределу 256 МБ, учитывая, что для некоторых других ресурсов потребуется память.
Так как каждое изображение может быть сделано с общим количеством 16 цветов. Теоретически я должен был бы использовать 1/8-е пространство, если я могу воспользоваться этим. Я огляделся, но не нашел ни слова о том, что я поддерживаю палитру изображений. (Хранение каждого пикселя с использованием меньшего количества бит, каждый из которых соответствует 32-битовому цвету RGBa)
Мы попытались использовать сжатие DXT, однако артефакты сжатия довольно заметны.
Я рассматривал возможность создания собственного формата файла с 4 битами на пиксель (и дополнительной информацией о палитре), загрузкой всех изображений этого нового формата в ОЗУ до битвы, а затем при рисовании какого-либо определенного изображения распаковывать только это изображение в необработанное изображение, чтобы оно могло отображаться правильно. Я не знаю, реалистично ли выполнять так много операций присваивания (appx 200x400 для каждого символа = 160k) для каждого кадра. Это звучит очень хаки для меня.
Есть ли у кого-нибудь советы относительно того, является ли мое решение разумным, и если есть, возможно, лучший доступный?
Большое спасибо!
(Я также попытался использовать изображение только с одним каналом, а затем использовать шейдер для выполнения ряда операторов if для перевода различных значений в другие цвета. К сожалению, было слишком много строк кода для шейдера. также довольно хаки и плохо масштабируется.)