2-мерная игра на основе плитки: каждая плитка как объект непрактична?

Я уже несколько месяцев пробую различные способы создания двухмерной тайловой игры. У меня всегда каждая плитка была отдельным объектом класса «Плитка». Объекты плитки хранятся в двумерном массиве объектов. Это оказалось крайне непрактичным, в основном с точки зрения производительности при одновременном рендеринге множества тайлов. Я помог в этом, разрешив рендеринг тайлов только на определенном расстоянии от игрока, но это тоже не очень хорошо. У меня также были проблемы с объектами, возвращающими исключение нулевого указателя, когда я пытался редактировать значения плитки в игре. Это связано с неправильной инициализацией объектов в 2D-массиве.

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

РЕДАКТИРОВАТЬ: Возможно, LWJGL просто не подходит для использования? У меня аналогичные проблемы с реализацией системы шрифтов с LWJGL... ввод более одного предложения приведет к снижению FPS на 100 или даже больше.


person GlassZee    schedule 09.07.2012    source источник
comment
сбить фпс на 100 и более. Вы неправильно проводите бенчмаркинг. Если вы хотите узнать, насколько быстро что-то делается, вам следует посмотреть на время, необходимое для выполнения чего-либо. Не FPS, а миллисекунды на кадр. 60 FPS — это 16,6 мс на кадр. Разница в 2 мс может снизить ваш FPS на 43 кадра, если вы работаете со скоростью 166 FPS. Но если вы работали со скоростью 30 кадров в секунду, добавление 2 мс к времени кадра снизит вас только до 28,5 кадров в секунду, а не на столько. Имеет значение только абсолютное время, а не FPS.   -  person Nicol Bolas    schedule 09.07.2012
comment
Должно быть, я что-то упускаю из виду. Вы можете упускать из виду многие вещи. Но поскольку все, что вы сказали нам, это то, что вы делаете тайловую игру с объектами в структурах данных, нам нечего дальше делать. Мы понятия не имеем, как вы их визуализируете. Неразбериха с бенчмаркингом означает, что мы даже не знаем, существует ли настоящая проблема (а не то, что вы считаете проблемой, но на самом деле все в порядке). Дайте нам актуальную информацию, и, возможно, мы сможем вам помочь.   -  person Nicol Bolas    schedule 09.07.2012
comment
Я не спрашивал конкретно, что не так с моим подходом, я спрашивал, соответствует ли сам подход тому, что обычно делается для тайловых игр. Спрашивать, что конкретно не так, значит публиковать мои сотни строк и говорить вам всем делать работу, что довольно лениво.   -  person GlassZee    schedule 09.07.2012


Ответы (2)


Для статических объектов (никуда не уходят, остаются на месте) 1 плитка = 1 объект — это нормально. Вот как это было сделано в Wolf3d. Для движущихся объектов у вас есть несколько вариантов.

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

Более разумный подход — вообще не хранить движущиеся объекты в ячейках/тайлах и обрабатывать их более-менее независимо от статических объектов. Но тогда вам понадобится код для определения видимости объекта. На самом деле, в графике самые основные проблемы с производительностью возникают из-за ненужных вычислений и рендеринга. Как правило, вы не хотите даже пытаться визуализировать то, что невидимо. Точно так же, если некоторые вычисления (особенно сложные) могут быть перемещены за пределы самых внутренних циклов, они должны быть перемещены.

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

person Alexey Frunze    schedule 09.07.2012

Двумерный массив объектов Tile должен подойти ........ это то, что используется в большинстве 2D-игр, и вы, безусловно, сможете получить достаточно хорошую производительность от OpenGL / LWJGL, чтобы визуализировать это с хорошей скоростью ( 100 кадров в секунду+).

Что нужно проверить:

  • Убедитесь, что вы вырезаете только видимый набор плиток (в соответствии с шириной и высотой экрана и положением игрока).
  • Убедитесь, что код для отрисовки каждой плитки быстрый... в идеале вы должны рисовать только один текстурированный квадрат для каждой плитки. В частности, вам не следует выполнять какие-либо сложные операции для каждой плитки в коде рендеринга.
  • Если вы сообразительны, вы можете рисовать несколько тайлов за один вызов OpenGL с помощью VBO/умного использования текстурных координат и т. д. Но это, вероятно, не нужно для игры, основанной на тайлах.
person mikera    schedule 09.07.2012