2012-03-26 2 views
3

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

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 работает по-разному, но у меня никогда не было этой проблемы с его использованием.

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

+0

Профилирование профилей с помощью инструмента GDebugger? Это скажет вам узкое место. – Pubby

+0

Используйте как можно больше вызовов на дрожжах, попробуйте поместить все в один VA (сделайте все переводы и т. Д. Самостоятельно на стороне процессора). – harold

ответ

9

Также дайте мне советы по повышению производительности.

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

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

glTranslatef

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

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

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

+0

Отличные советы! Один вопрос: «Сократите количество очень больших спрайтов. Огромный выравниваемый по экрану/пиксельный спрайт (1024 * 1024) снизит FPS даже на очень хорошем оборудовании». - Что мне делать, если у меня есть большой спрайт hi-res, чтобы служить в качестве статического фона, например, и я не хочу обойтись без него? Любые альтернативы? – nietaki

+0

Насколько пули заливают экран, это будет векторная графика, нарисованная с нуля. Итак, что я могу сделать с моим текущим методом, чтобы исправить это? В ожидании ответа я переключился на вершинные массивы и не увидел заметного улучшения, хотя это было довольно быстро сделано. Что я делаю неправильно? Теперь я смотрю на область2048. Игра будет состоять в основном из векторной графики. – SpaceFace

+0

«Положить все в VA» по-прежнему применяется с текстурированными спрайтами. Не верю? Попробуй. Миллион призывов убивает игру очень хорошо. – harold

Смежные вопросы