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