2015-02-24 3 views
0

Я делаю переписывание игры, с которой я работал с LWJGL (исходный движок был в чистой java), и я хочу узнать наиболее эффективный способ отображения карты на экран. Я собираюсь сделать карту с черепицей и слоем для каждой плитки, столкновений и неподвижных объектов. Все, что я буду читать в игре, анализируя XML-файл.Tile Engine в LWJGL

Мой вопрос заключается в том, должен ли я делать это так и читать каждую плиту в игре индивидуально и сохранять значения в 2d-массиве, назначать их спрайтам и отображать каждый спрайт на экране в соответствующем месте? Или было бы меньше налогов на CPU/GPU, чтобы сделать эти слои собственными отдельными файлами изображений и отобразить слои, а не плитки? Я предполагаю, что вторая будет больнее в заднице, но стоит ли это?

+0

Современные графические процессоры могут отображать десятки миллионов треугольников в секунду. Второй способ может быть немного быстрее, но это не имеет значения, когда вы используете только 0,01% от емкости для начала. – immibis

+0

Ohhh. Ну, я читал где-то раньше, как у какого-то парня было около 700 спрайтов на экране, и из-за этого у него было значительное отставание, но я думаю, он не уточнил, какова была резолюция для этих спрайтов. Тем не менее, я буду использовать 16x16 или 32x32, поэтому я думаю, что вы правы. – CosmicKidd

+0

Он, вероятно, отбрасывал свои спрайты глупо, как перегружая их каждый кадр. – immibis

ответ

2

Лучше комбинировать плитки вместе, чтобы сформировать один большой атлас текстуры. Предполагая, что вы используете 32x32 пиксельные плитки, текстура 2k может содержать до 4096 различных фрагментов, что потенциально более чем достаточно для игры. Причина в том, что вы можете связать эту текстуру один раз и сделать (почти) весь рендеринг с ней, избегая дорогостоящей операции переключения текстур. Не используйте отдельные рисунки для каждой плитки. Все текстуры и другие ресурсы рендеринга должны загружаться спереди, как правило, при загрузке игры или загрузке уровня.

Что касается реальных плиток и объектов, вы должны создать буфер вершин, который содержит атрибуты вершин для всех объектов и загрузить его во время загрузки уровня. Этот буфер будет содержать позиции вершин, цвета, координаты текстур ... все, что вам нужно для рисования плит, и его можно разбить на несколько буферов, если этого недостаточно. Для каждого фрейма вы используете координаты камеры, чтобы узнать, какие плитки видны, а какие - нет, затем выпустите ничью с начальным индексом первой видимой плитки и количеством видимых фрагментов. Простая проверка AABB здесь очень хороша. Разумеется, для достижения этого буфер вершины должен быть выложен таким образом, чтобы он шел только в одном направлении, например. слева направо и сверху вниз.

В качестве альтернативы вы можете перейти к более сложной подсчету вершины за счет еще нескольких вызовов рисования: разбиение мира на куски, чтобы каждый кусок был достаточно большим, чтобы покрыть весь экран. Создайте буфер вершин для каждого фрагмента, как описано выше. Затем выполните одну и ту же проверку камеры, чтобы узнать, какой кусок виден и нарисовать. В этом случае вы видите как минимум 1 кусок и не более 4 кусков, видимых в любой момент времени, что означает от 1 до 4 вызовов. Этот подход немного более выгоден, чем предыдущий, потому что вместо того, чтобы перебирать каждую отдельную плитку, вы можете перебирать куски, что означает, что требуется гораздо меньше проверок.

Если вы сделали правильно, вам, вероятно, не понадобится больше, чем несколько призывов к рисованию для рендеринга мира и сможете рисовать огромное количество плиток. По-видимому, это означает только для статических объектов, вам придется рисовать динамические объекты по-разному. Имейте это в виду, что призывы рисования могут переключиться в контекст, и их следует избегать, когда это возможно.

+0

Благодарим вас за ответ. Я довольно новичок в OpenGL, поэтому мне нелегко обернуть голову вокруг всего этого. Я также не нахожу ресурсы, которые фактически показывают, что делают эти объекты openGL и как их использовать. Можете ли вы указать мне ресурс, который объясняет те темы, которые вы упомянули? – CosmicKidd

+0

Это хороший, чтобы начать работу с openGL http://learnopengl.com/. Он использует C++, но все должно быть одинаковым с java. Что касается оптимизации, это довольно широкая и сложная тема, поэтому давайте не будем слишком переживать. – Ethan

+0

Все хорошо; В настоящее время я делаю 2D-игру, поэтому я действительно сомневаюсь, что для рендеринга потребуется слишком много оптимизации для работы. Спасибо чувак! – CosmicKidd