Идеальное количество спрайтов для LWJGL/OpenGL

Я делаю игру, используя LWJGL, и пока решил иметь 5 или 6 листов спрайтов. Это как один для блоков, один для предметов, объектов и т. д. Таким образом, у меня есть листы спрайтов со спрайтами, которые тесно связаны и обычно имеют одинаковый размер (в случае блоков и предметов). Но лучший ли это способ? Или я должен просто сбрасывать все на один лист спрайтов, без какой-либо организации?

Если я делаю это правильно, есть еще одна проблема. Например, когда вы находитесь на карте, мне нужно рисовать блоки. Но над блоками могут быть электрические провода и другие вещи, которые находятся на отдельном листе спрайтов. Однако эта информация хранится в том же массиве. Так что обычно я просто перебираю его один раз, и каждый раз рисую блок, а затем проволоку над ним — переключаю листы спрайтов дважды за каждую итерацию. Но я подумал, что это может занять некоторое время, чтобы переключить их, поэтому, может быть, было бы интереснее запустить эту штуку дважды, сначала нарисовать все блоки, а затем снова повторить итерацию, чтобы нарисовать провода? Чтобы изменить текстуры, я использую класс SlickUtil Texture, у которого есть метод привязки — очень простой в использовании.


person Luan Nico    schedule 01.02.2013    source источник


Ответы (1)


Нет «идеала»; есть просто факторы, которые имеют значение для ваших нужд.

Помните причину, по которой вы вообще используете листы спрайтов: потому что переключение текстур слишком затратно для каждого объекта при работе с 2D-рендерингом. Так что пока вы не переключаете текстуры для каждого визуализируемого спрайта, вы уже опережаете игру по производительности.

Другие соображения, которые вы должны принять во внимание:

  • Минимальные технические характеристики пользовательского оборудования. В частности, какой минимальный размер GL_MAX_TEXTURE_SIZE вы хотите, чтобы ваш код работал? Чем больше ваши листы спрайтов, тем выше требования к оборудованию, поскольку один лист спрайтов должен быть текстурой.

    Это значение зависит от оборудования, но есть некоторые общие требования. OpenGL 3.3 требует как минимум 1024; почти каждая часть аппаратного обеспечения GL 3.3 дает 4096. OpenGL 4.3 требует огромных 16384, что приближается к теоретическим пределам пропускной способности координат текстуры с плавающей запятой (при условии, что вы хотите по крайней мере 8 бит точности координат текстуры субпикселя).

    GL 2.1 имеет минимальное требование 64, но любое фактическое аппаратное обеспечение 2.1 будет предлагать от 512 до 2048. Так что выбирайте размер листа спрайтов исходя из этого.

  • Что вы рендерите. Вы хотите иметь возможность рендерить как можно больше с одного листа спрайтов. Чего следует избегать, так это частых переключений текстур. Если ваш мир разделен на слои, если вы можете разместить свои спрайты для каждого слоя на отдельном листе, у вас все в порядке. Никакое оборудование не задохнется от 20 изменений текстур; проблема в десятках тысяч.

    Главное — рендерить сразу все, что использует лист. Не обязательно в том же вызове рендеринга; вы можете переключать сетки и форму шейдера / состояние фиксированной функции. Но вы не должны переключать листы между этими рендерами, пока не отрендерите все необходимое для этого листа.

person Nicol Bolas    schedule 02.02.2013
comment
Спасибо за Ваш ответ. Затем я продолжу использовать несколько листов спрайтов и просто изменю рендеринг карты, чтобы сначала отрисовывались все блоки, а затем провода. - person Luan Nico; 02.02.2013