Мозаичная карта и спрайты: правильно ли я делаю?

Я разрабатываю старомодную 2D RPG с помощью Python + pyglet.

Карта состоит из нескольких слоев (до 10), каждый из которых состоит из тайлов прямоугольной формы (32x32 пикселя). Спрайты (партийные персонажи, NPC и некоторые другие вещи) рисуются между двумя слоями (обычно перед последним).

Для рендеринга я использую один пакет со многими OrderedGroups: по одной группе на слой и по группе на спрайт.

Проблема со спрайтами заключается в том, что они должны отображаться в порядке убывания их значения y, поэтому группы расположены следующим образом (предположим, что на карте есть 3 слоя, и что 2 спрайта должны быть отрисованы непосредственно перед последним):

g[0] = OrderedGroup(0) : first layer
g[1] = OrderedGroup(1) : second layer

g[2] = OrderedGroup(2) : empty, serves as a base for the following :
OrderedGroup(0, parent = g[2]) : the highest sprite
OrderedGroup(1, parent = g[2]) : the lowest sprite

g[3] = OrderedGroup(3) : the third layer

Когда я добавляю спрайты слоев в пакет, я указываю, что они статичны. Когда я добавляю спрайты для вечеринок, они становятся «динамическими».

Итак, мой первый вопрос: поскольку все они принадлежат к одной и той же партии, разве это не противоречит друг другу? (произносится по-другому: является ли «статический» или «динамический» свойством объекта спрайта или пакета?) (примечание: я уточняю, что у меня действительно мало знаний об OpenGL и понятия не имею, как пакет и группы реализованы)

Пока что производительность правильная (хочу 60 фпс, а их у меня до 8 движущихся спрайтов), но производительность быстро падает при более чем 8 движущихся спрайтов (чего в финальной игре быть не должно, а хотелось бы мой движок будет максимально эффективным без перевода частей на C/ASM).

Итак, мой второй вопрос: является ли стратегия, которую я выбираю (используйте партии и как можно меньше), хорошей?

Заранее спасибо за ответы


person Fred    schedule 19.07.2012    source источник
comment
Возможно, этот вопрос лучше подходит для пользователей pyglet. Отпишусь и там, извините за кросспостинг.   -  person Fred    schedule 20.07.2012


Ответы (1)


Я не являюсь пользователем Pyton или Pyglet, но вот несколько советов:

  1. вы используете OpenGL

    поэтому вам не нужны никакие Y и/или рендеры сортировки плоскости просмотра. Z-Buffer сделает это за вас, поэтому порядок прорисовки может быть любым... если только вы не используете прозрачные плитки (в этом случае у вас нет выбора).

  2. вы предоставляете код

    но на самом деле это ничего не говорит, убедитесь, что вы ничего не сортируете/группируете внутри рендеринга. Кажется, что вы создаете упорядоченные списки для каждого кадра, что может нелинейно влиять на производительность. Обычно для кода с HW-ускорением все нормально, пока не дойдете до какого-нибудь критического узкого места, а потом вдруг все полетит к черту!!!

  3. хранить карты слоев в отдельных 2D-картах

    тогда вам вообще не нужна сортировка/группировка. Если объект переходит с одного слоя на другой, просто обновите слои стенда соответствующим образом.

person Spektre    schedule 22.01.2014