OpenGL замедляется, когда на экране много вещей - PullRequest
0 голосов
/ 16 февраля 2012

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

Когда на экране много вещей, все замедляется. И когда я говорю много, я имею в виду 200+ объектов, но начинает заметно, может быть, с 50.

Вот как все отображается: у меня есть class Renderable с virtual void render(), который вызывается RenderManager в цикле void manage(), который вызывает render() для каждого Renderable на экране.

Основной цикл выглядит следующим образом

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

_renderManager.manage();

glFlush();
SDL_GL_SwapBuffers();

и render() для объектов, которые я использую, только квадраты, поэтому

glBegin(GL_QUADS);
// Draw square with colors
glEnd();

Кажется, что загрузка моего процессора или памяти совсем не высока, просто ... игра замедляется.

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Я полагаю, что проблема в том, что вы используете непосредственный режим, вы должны использовать Vertex Arrays, если у вас проблемы с производительностью.

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

Взгляните сюда: http://www.songho.ca/opengl/gl_vertexarray.html

Фактически, это факт, что с glBegin ... glEnd вы в конечном итоге делаете много вызовов в GPU, в то время как с помощью вершинных массивов вы предварительно вычисляете свои фигуры, сохраняете их в буферах и напрямую рисуете их, уменьшая количество вызовов на значительную сумму.

0 голосов
/ 16 февраля 2012

Извините, я никогда не использовал OpenGL, и я действительно понятия не имел, что я делаю, но я нашел решение (и сейчас работаю над этим!).Также спасибо, Джек, за ответ!Я определенно использую массивы вершин сейчас, я обнаружил, что glBegin () и glEnd () устарели.Я мог бы даже попробовать объекты буфера вершин.

Проблема была в том, что каждый Renderable вызывал glBegin () и glEnd (), когда RenderManager вызывает render () для каждого Renderable каждого цикла.Это вызывает большую нагрузку на GPU.

На момент написания этого ответа у меня в RenderManager было sendVertices(GLfloat vertices[]);, которое добавляет все вершины к std::vector<GLfloat>.Во время цикла для RenderManager я создаю указатель на вершину

glVertexPointer(2, GL_FLOAT, 0, &vertices[0]);

, затем вызываю

glDrawArrays(GL_QUADS, 0, vertices.size() / 2);

Таким образом, вместо рендеринга для каждогоОбъект, который визуализирует все сразу на основе вершин.Теперь я начинаю видеть замедление на 800+ объектах.Хотя и не очень, но мне еще предстоит много работы.Потому что сейчас вектор vertices воссоздает каждый цикл, а не модифицируется.Кроме того, это не учитывает цвета, но я на правильном пути!

Первоначально переключаясь на массивы вершин, это не имело большого значения, потому что оно все еще визуализировалось для каждого отдельного объекта, поэтомуglDrawArrays() вызывали для каждого из 200+ Renderable.

РЕДАКТИРОВАТЬ:

Также извините за то, что не предоставил достаточно информации, я предполагаю, что проблема очевидна.Какая уверенность в себе, да?Ха-ха.

...