Расположение элементов в 2D пространстве с OpenGL ES

Если пустой указатель никогда не указывает, что ошибка тогда просто возвращает пустой указатель.

, Если пустой указатель является всегда ошибкой тогда, выдают исключение.

, Если пустой указатель является иногда исключением тогда, кодируют две стандартных программы. Одна стандартная программа выдает исключение, и другой булева тестовая задача, которая возвращает объект в выходном параметре, и стандартная программа возвращает false, если объект не был найден.

трудно неправильно использовать стандартную программу Попытки. Очень легко забыть проверять на пустой указатель.

Поэтому, когда пустой указатель является ошибкой, Вы просто пишете

object o = FindObject();

, Когда пустой указатель не является ошибкой, можно кодировать что-то как

if (TryFindObject(out object o)
  // Do something with o
else
  // o was not found
7
задан Rob 16 November 2009 в 16:10
поделиться

3 ответа

Вы обеспокоены накладными расходами, которые требуются для преобразования модели (в данном случае квадрата) из координат модели в мировые координаты, когда у вас много моделей. Это кажется очевидной оптимизацией для статических моделей.

Если вы построите вершины квадрата в мировых координатах, то, конечно, это будет быстрее, поскольку каждый квадрат позволит избежать дополнительных затрат на эти три функции (glPushMatrix, glPopMatrix и glTranslatef), так как нет необходимости переводить из модели в мировые координаты во время рендеринга. Я понятия не имею, насколько это будет быстрее, я подозреваю, что это не будет огромной оптимизацией, и вы потеряете модульность сохранения квадратов в координатах модели: что, если в будущем вы решите, что хотите, чтобы эти квадраты можно было перемещать ? Будет намного сложнее, если ты сохраняют свои вершины в мировых координатах.

Короче говоря, это компромисс:

Мировые координаты

  • Больше памяти - каждому квадрату нужен свой собственный набор вершин.
  • Меньше вычислений - нет необходимости выполнять glPushMatrix, glPopMatrix или glTranslatef для каждого квадрата во время рендеринга.
  • Менее гибкий - отсутствует поддержка (или усложняет) для динамического перемещения этих квадратов

Координаты модели

  • Меньше памяти - квадраты могут совместно использовать одни и те же данные вершин
  • Больше вычислений - каждый квадрат должен выполнять три дополнительные функции на время рендеринга.
  • Более гибкий - квадраты можно легко движется, манипулируя вызов glTranslatef.

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

Удачи вам и ваших приключений в разработке игр для iPhone!

6
ответ дан 6 December 2019 в 23:12
поделиться

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

1
ответ дан 6 December 2019 в 23:12
поделиться

Если вы используете только квадраты с выравниванием по экрану, возможно, будет проще использовать расширение OES Draw Texture . Затем вы можете использовать одну текстуру для хранения всех ваших игровых «спрайтов». Сначала укажите прямоугольник обрезки, задав параметр TexParameter GL_TEXTURE_CROP_RECT_OES . Это граница спрайта внутри большей текстуры. Для рендеринга вызовите glDrawTexiOES , передав желаемое положение и размер в координатах области просмотра.

int rect[4] = {0, 0, 16, 16};
glBindTexture(GL_TEXTURE_2D, sprites);
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);
glDrawTexiOES(x, y, z, width, height);

Это расширение доступно не на всех устройствах, но отлично работает на iPhone.

4
ответ дан 6 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: