OpenGL работает очень медленно - PullRequest
2 голосов
/ 26 сентября 2011

Работая над игрой, я тестировал свой рендерер. К сожалению, он работает только со скоростью около 4 кадров в секунду. Профилирование показывает, что удивительно, только 5% времени выполнения принадлежит моему коду, а оставшиеся 95% времени выполнения были потрачены на nvoglnt.dll.

Хотя используется только одна текстура 256x256, и кроме этого, единственный код openGL, который я использую за пределами нескольких преобразований камеры, - это следующий шаблон кода. Выполняется всего 134217728 раз, в общей сложности 33554432 квада.

glTexCoord2f(u, v);
glColor3f(r, g, b);
glVertex3f(x, y, z);

Что я мог сделать неправильно, из-за чего OpenGL стал настолько медленным? Существуют ли какие-либо общие методы повышения производительности, которые я мог бы использовать, чтобы улучшить его?

Ответы [ 2 ]

4 голосов
/ 26 сентября 2011

Как сказал datenwolf, 134217728 - это много раз. 33 миллиона квадов - это даже много, если вы использовали массивы вершин. Но современные карты должны справиться с этим довольно хорошо.

Узким местом здесь является полностью центральный процессор, вы вызываете 134 миллиона x 3 функций каждый кадр . Так как вы работаете на 4FPS. Это 1,6 миллиарда вызовов функции в секунду! Не удивительно, что он работает так медленно.

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

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

3 голосов
/ 26 сентября 2011

Выполняется только 134217728 раз, в общей сложности 33554432 квада.

Каждый из этих "немногих" вызовов заставляет вашу систему переключать контекст выполнения между вашей программой и драйвером OpenGL.Это не «мало».Честно говоря, я бы рассмотрел этот вопрос как хороший троллинг, потому что каждый учебник по OpenGL в эти дни скажет вам не использовать немедленный режим для того, чтобы точно наблюдать серьезную производительность, которую вы заметили, и этот непосредственный режим вызывает , то есть glBegin,glEnd, glVertex и т. д.

Используйте массивы вершин или еще лучше Объекты буфера вершин .

...