Моя видеокарта - Mobile Intel 4 Series. Я обновляю текстуру с изменением данных каждый кадр, вот мой основной цикл:
for(;;) {
Timer timer;
glBindTexture(GL_TEXTURE2D, tex);
glBegin(GL_QUADS); ... /* draw textured quad */ ... glEnd();
glTexSubImage2D(GL_TEXTURE2D, 0, 0, 0, 512, 512,
GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
swapBuffers();
cout << timer.Elapsed();
}
Каждая итерация занимает 120 мс. Однако вставка glFlush перед glTexSubImage2D приносит время итерации до 2 мс.
Проблема не в формате пикселей. Я пробовал форматы пикселей BGRA, RGBA и ABGR_EXT вместе с типами пикселей UNSIGNED_BYTE, BYTE, UNSIGNED_INT_8_8_8_8 и UNSIGNED_INT_8_8_8_8_EXT. Внутренний формат пикселей текстуры - RGBA.
Порядок звонков имеет значение. Например, перемещение загрузки текстуры перед отрисовкой четырехугольника позволяет исправить медлительность.
Я также пробовал это на карте GeForce GT 420M, и там она работает быстро. У моего реального приложения есть проблемы с производительностью на картах сторонних производителей, которые устраняются вызовами glFlush, но я еще не отогнал их до тестового примера.
Есть идеи, как это отладить?