Я занимаюсь разработкой 2D-игры, и у меня много спрайтов. Я использовал 3D-анимацию и модели для рендеринга в 2D, чтобы придать им «Fallout» или «Diablo». Это также проще, чем рисовать от руки, смеется.
Мне уже приходилось снижать частоту кадров до 15 кадров в секунду, что было самым низким значением, которое я мог опустить, чтобы они не выглядели прерывисто. Однако было грустно из-за того, как выглядели невероятно плавные 24 кадра.
Я сделал это по двум причинам:
1) Сократить пространство на жестком диске. Чем меньше изображений, тем меньше будет моя общая игра.
2) Сократить потребление оперативной памяти. Чем меньше изображений загружается, тем больше у меня шансов избежать проблем, связанных с ограничением моего объема оперативной памяти.
Однако, если бы был способ сжать изображения как на жестком диске, так и в оперативной памяти, я бы так и сделал. Я проверял это раньше, и большинство из них не получают никаких изменений в качестве при передаче из RGBA8888 в RGBA5555 и лишь небольшое попадание при преобразовании в RGBA4444 в моей программе TexturePacker. Я не делаю этого в настоящее время, потому что SFML, похоже, использует один и тот же объем памяти независимо от того, какой это тип изображения .PNG. Я изучал, как загрузить его по-другому, но не смог найти ничего по этому вопросу.
Я много читал о том, как работать с 2D-видеоиграми. Консенсус ошеломляет: упакуйте свои спрайты в более крупную текстуру для отличной производительности! Поэтому я упаковываю свои крошечные спрайты в гораздо большую таблицу спрайтов, используя TexturePacker.
Тем не менее, я планирую иметь 10-15 анимаций на персонажа, 5 направлений для перемещения и 15-40 кадров на анимацию (вероятно, в среднем 24). 15 анимаций, 5 направлений и в среднем 24 кадра на анимацию; Это 1800 отдельных кадров на символ. Если упаковано в спрайт лист, то это всего 75 изображений. (Один лист спрайтов на Анимацию, на Направление. 15 * 5)
Для одного персонажа с огромным боссом в игре я не могу использовать таблицу спрайтов и должен запрограммировать способ простой загрузки одного изображения за раз. Я не знаю, смогу ли я сделать это для производительности еще.
Для персонажей я уже упаковал их в таблицу спрайтов. Для одного ходящего персонажа это работает большую часть времени, хотя иногда и останавливается. Однако я приписываю это моему плохо продуманному коду, который заменяет текстуры вместо предварительной загрузки всех текстур для этого символа.
Если бы я должен был предварительно загрузить текстуры, это имеет смысл для спрайтов. Я только предположил бы, что это плохая идея предварительно загрузить 1800 крошечных изображений для каждого персонажа.
Тем не менее, я думаю, что потоковая передача их в память и из памяти по одному будет чрезвычайно быстрой, поэтому мне нужно было бы иметь только одно изображение в памяти за один раз. Разве это не значит, что в любой данный момент каждый персонаж потребляет всего несколько КБ вместо 45 + МБ?
Я полагаю, что это убило бы мою производительность, поскольку потоковая передача должна была бы быть невероятно быстрой (15 изображений входили и выходили из памяти и рендеринга в секунду), и хотя изображения были бы очень маленькими - возможно, было бы лучше загрузить символьные спрайт-листы в память вместо. Но мне все равно придется кодировать систему рендеринга в виде одного изображения для моего более крупного персонажа.
Я экспериментировал, но это не простой процесс. Особенно учитывая тот факт, что я работаю над другими частями игрового движка, которые сейчас не связаны с графикой.