2009-10-12 2 views
2

Я и мой друг пытаются ускорить 2D-игру с OpenGL. Видеокомпьютер - это Radeon X1250, который, похоже, недостаточно силен и может отображать до 80 1366x768 кадров в секунду. Учитывая, что мы рисуем много спрайтов друг над другом, производительность резко падает под 60 FPS, на которые мы нацеливаемся. Не могли бы вы предложить советы по оптимизации для рендеринга быстрого 2D с OpenGL?Использование OpenGL для ускорения 2D-графики

EDIT: некоторые уточнения: Разработка происходит на C++ под Linux. Мы сделали это с SDL, но производительность была неудовлетворительной, поэтому мы решили перейти на OpenGL, который оказался намного быстрее. Конечно, тогда появился толчок для реализации большего количества функций, требующих от нас перерисовать весь экран в каждом кадре.

Наша тестовая программа отображает текстурированные квадратные квадраты размером 256x256 на экране 1366x768. Если перед сменой буфера укладывается один слой плиток, он дает 80 FPS, если два слоя укладываются, частота кадров падает ниже 60 FPS. Учитывая, что плата потребуется для декодирования и отображения некоторых небольших MPEG одновременно, это может быть неудовлетворительным.

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

+0

Не могли бы вы предоставить какой-то код? –

+0

Это поможет, если вы напишете, сколько спрайтов вы говорите. Много ли 100, 1000, 10000? Тогда было бы легче сказать, если вы делаете что-то неправильно или как можете оптимизировать. – Foxfire

ответ

4

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

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

Хотя современные карты могут выполнять множество операций, они все еще имеют ограничение на количество пикселей, которые они могут нажать.

Для уменьшения этого некоторые предложения являются:

  • Не рисовать все каждый кадр - если это возможно - сделать некоторые части других буферов, а затем смешать те более - на более низком разрешении, если это возможно
  • Дон 't использовать смешивание, если вам это не нужно - смешивание происходит намного медленнее, чем рисование непрозрачных материалов.
  • Используйте более дешевую программу фрагментации фрагментов/фрагментов - если вы используете программируемый конвейер (NB: я не знаю, как вы может действительно сказать, насколько это дорого)
  • Использовать столько отбраковывая, как вы можете, - избегайте рисования вещей, которые невозможно увидеть вообще. Если спрайт полностью (или в основном) скрыт за другими, вам не нужно его рисовать.
  • Масштабирование/интерполяция, вероятно, относительно дешево - используйте текстуры нижних ребер и масштабируйте их, особенно если ваши текстуры «размыты» для начала.

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

+1

Не могли бы вы подробнее рассказать о «Не рисовать все кадры»? – pachanga

1

Вы уверены, что рендеринг является проблемой, или у вас есть логика, связанная с рендерингом? Оптимизация производительности в OpenGL - довольно большая тема, поэтому я просто укажу вам на ресурс.

First link on google

2

OpenGL разработан, чтобы быть быстрым, но можно написать так, он может иметь низкую производительность.

есть слишком много неизвестных, чтобы иметь возможность много помочь. Например, какой язык (я бы угадайте C++), какую структуру вы используете, или вы сами написали?

Какая часть экрана вы воссоздаете? Например, вы регенерируете каждый объект, а не просто переводите их?

Вы можете найти вопрос полезным: What are some best practices for OpenGL coding (esp. w.r.t. object orientation)?

Если бы вы привести несколько примеров того, где вы профилированные, чтобы определить, где замедление, это было бы полезно.

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

Как выглядит ваш игровой цикл? Например, есть ли какое-либо взаимодействие с мышью или клавиатурой и влияет ли эта логика на частоту кадров?

У меня была эта проблема в один момент, когда я перерисовывал 70 кадров в секунду, но моя музыка не начиналась или заканчивалась на правильной миллисекунде, поэтому я меняю цикл только на 30 кадров в секунду и увеличиваю, как часто обрабатываю музыку, и моя производительность увеличилась.

2

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

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

2

Как всегда, если вы указали версии OpenGL, то вам будет легче получить более точный ответ. Кажется, что этого не хватает в большинстве вопросов, связанных с OpenGL, на StackOverflow.

Если вы загружаете на сервер множество данных на вершину, убедитесь, что вы храните данные вершин в объектах буфера . Никогда не используйте немедленный режим, aka glBegin/glEnd пар. Вместо этого используйте glDrawArrays, glDrawElements или другой вызов рисования массива. Это уже создает огромный прирост производительности.

Overdrawing не является медленным сам по себе, но он уверен, что горит заправкой без причины. Но отсечение окклюзии часто не стоит первоначальной стоимости установки. И смешение на фрагмент сжигает много fillrate.

Если эти советы не помогают, я рекомендую вам проверить, действительно ли ваше приложение связано с GPU. У меня есть сомнения. Узкое место может быть где-то еще. Возможно, ваш X-визуальный/FBConfig не аппаратно ускорен?

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