OpenGL 2D советы по производительности - PullRequest
3 голосов
/ 26 марта 2012

В настоящее время я занимаюсь разработкой Touhou-esque Bullet Hell Shooter. Экран будет полностью заполнен маркерами (поэтому я хочу, чтобы здесь работали экземпляры), но я хочу, чтобы это работало на более старом оборудовании, поэтому в настоящий момент я делаю что-то вроде этого, нет цветов, текстур, и т.д. пока, пока я не выясню это.

glVertexPointer(3, GL_FLOAT, 0, SQUARE_VERTICES);
for (int i = 0; i < info.centers.size(); i += 3) {
    glPushMatrix();
    glTranslatef(info.centers.get(i), info.centers.get(i + 1), info.centers.get(i + 2));
    glScalef(info.sizes.get(i), info.sizes.get(i + 1), info.sizes.get(i + 2));
    glDrawElements(GL_QUADS, 4, GL_UNSIGNED_SHORT, SQUARE_INDICES);
    glPopMatrix();
}

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

Я довольно новичок в OpenGL, но я, по крайней мере, слышал и пробовал все, что можно сделать, хотя и не говорил, что мне это хорошо. Эта игра является 2D-игрой, я перешел с SDL на Opengl, потому что она облегчит некоторые необычные эффекты. Очевидно, что SDL работает по-другому, но у меня никогда не было этой проблемы при его использовании.

Это сводится к тому, что я явно что-то не так делаю, так как я могу правильно реализовать инстансинг для старого оборудования (OpenGL 1.x)? Кроме того, дайте мне какие-либо советы по повышению производительности.

1 Ответ

9 голосов
/ 26 марта 2012

Кроме того, дайте мне какие-либо советы по повышению производительности.

Если вы собираетесь использовать спрайтов ....

  1. Загрузите все спрайты в одну огромную текстуру.Если они не подходят, используйте несколько текстур, но сохраняйте небольшое количество текстур - чтобы избежать переключения текстур.
  2. Переключайте текстуры и изменяйте состояние OpenGL как можно реже.В идеале вы должны установить текстуру один раз и нарисовать с ней все, что сможете.
  3. Использование текстурных шрифтов для текста.Шрифт FTGL может выглядеть неплохо, но он может сильно ухудшить производительность со сложными шрифтами.
  4. По возможности избегайте альфа-смешивания и используйте альфа-тестирование.
  5. При альфа-смешивании всегда используйте альфа-тестирование, чтобы уменьшить количество нарисованных пикселей.Если у вашей текстуры много пикселей с альфа == 0, обрежьте их с помощью альфа-теста.
  6. Уменьшите количество очень больших спрайтов.Огромный спрайт с выравниванием по экрану / с выравниванием по пикселям (1024 * 1024) будет сбрасывать FPS даже на очень хорошем оборудовании.
  7. Не используйте текстуры размером не в 2.Они (раньше) производили огромное падение производительности на некоторых картах ATI.

glTranslatef

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

В 2D-игре вашим главным узким местом будет скорость передачи памяти графического процессора - передача данных с текстуры на экран.Так что «используйте как можно меньше вызовов отрисовки» и «поместите все в VA» вам не поможет - вы можете снизить производительность одним спрайтом.

Однако , если вы собираетесь использовать векторную графику (см. area2048 ( youtube ) или rez ), который не использует текстуры, тогда большинство советов выше не будут применяться, и такая игра не будет сильно отличаться от 3D-игры.В этом случае будет разумно использовать массивы вершин, объекты буфера вершин или списки отображения (зависит от того, что доступно) и использовать матричную функцию - потому что узким местом будет обработка вершин.Вам все равно придется минимизировать количество переключателей состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...