OpenGL медленнее на окнах

В настоящее время я пишу небольшой движок игры, используя OpenGL. Данные сетки загружаются на vbos, используя GL_STATIC_DRAW. Поскольку я читал, что glBindBuffer довольно медленный, я пытался минимизировать его использование, накапливая информацию, необходимую для рендеринга, и затем несколько раз увеличивал количество vbo, используя только один glBindBuffer для vbo (вроде как пакетный рендеринг?). Вот код, который я использую для фактического рендеринга:

int lastID = -1;
 for(list<r_job>::iterator it = jobs.begin(); it != jobs.end(); ++it) {
 if(lastID == -1) {
 lastID = *it->vboID;
 glBindTexture(GL_TEXTURE_2D, it->texID);
 glBindBuffer(GL_ARRAY_BUFFER, *it->vboID);
 glVertexPointer(3, GL_FLOAT, 4*(3+2+3), 0);
 glTexCoordPointer(2, GL_FLOAT, 4*(3+2+3), (void*)(4*3));
 glNormalPointer(GL_FLOAT, 4*(3+2+3), (void*)(4*(3+2)));
 }

 if(lastID != *it->vboID) {
 glBindTexture(GL_TEXTURE_2D, it->texID);
 glBindBuffer(GL_ARRAY_BUFFER, *it->vboID);
 glVertexPointer(3, GL_FLOAT, 4*(3+2+3), 0);
 glTexCoordPointer(2, GL_FLOAT, 4*(3+2+3), (void*)(4*3));
 glNormalPointer(GL_FLOAT, 4*(3+2+3), (void*)(4*(3+2)));
 lastID = *it->vboID;
 }

 glPushMatrix();
 glMultMatrixf(value_ptr(*it->mat)); //the model matrix
 glDrawArrays(GL_TRIANGLES, 0, it->size); //render
 glPopMatrix();
 }
</r_job>

Список сортируется по идентификатору vbos. Данные чередуются. Мой вопрос о скорости. Этот код может отображать около 800 vbos (один и тот же, только drawArrays вызывается несколько раз) со скоростью 30 кадров в секунду в моем macbook 2010. На моем ПК (Phenom II X4 955/HD 5700) всего за 400 звонков fps идет ниже 30. Может ли кто-нибудь объяснить это мне? Я надеялся на ускорение на моем компьютере. Я также использую GLFW, GLEW, Xcode и VS2012 для каждой машины.

EDIT: сетка, которую я получаю, имеет около 600 вершин.

2 ответа

Я уверен, что вы работали в режиме Release, но вы также можете подумать о запуске в режиме Release без прикрепленного отладчика. Я думаю, вы обнаружите, что это решит ваши проблемы с производительностью с помощью list :: sort. По моему опыту отладчик VS может оказать значительное влияние на производительность, когда он подключен, - гораздо больше, чем gdb.

2000 - разумное место, чтобы начать замечать падение FPS. В этот момент вы делаете почти 10 000 вызовов API за кадр. Чтобы комфортно подняться выше, вам нужно будет начать делать что-то вроде instancing, чтобы вы рисовали несколько объектов одним вызовом.

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


Поэтому, я думаю, я нашел ответ. Включение VSync в Центре управления AMD значительно увеличило fps (вероятно, из-за swapBuffers GLFWs), хотя они все еще были ниже значений моего macbook. После некоторой отладки я обнаружил, что list :: sort как-то ОЧЕНЬ медленный на окнах и тянул мои fps вниз...

Итак, прямо сейчас (без списка :: sort) падение fps (<60) около 2000 единиц: 600 * 2000=1 200 000

Должны ли это быть мои графические карты?

licensed under cc by-sa 3.0 with attribution.