Я пытался визуализировать облако точек (>100 миллионов точек), я перенес все данные в GPU и просто использовал имя буфера для доступа к ним. Все работает нормально, пока я не реализовал функцию, которая требует от меня переноса всех данных обратно в оперативную память.
Вот как я передаю данные в GPU:
glBindVertexArray(vao);
// some data
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * GetSize() * 3, &vertices[0], GL_STATIC_DRAW); // pos
// some attributes
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); // pos
...
// some other code
...
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
glDisableVertexAttribArray(0);
// Clear the contents in the RAM
vertices.clear();
vertices.shrink_to_fit();
Затем мне в какой-то момент понадобилась функция, чтобы вернуть данные, чтобы сохранить изменения, вот что я сделал:
// restore data back to RAM
// this code was called for >4000 times
glBindBuffer(GL_ARRAY_BUFFER, c.vbo);
c.vertices.clear();
c.vertices.resize(c.sizeg);
glGetBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(glm::vec3) * c.sizeg, &c.vertices[0].position.x);
После этого программа будет зависать каждый раз, когда мне нужно отобразить это облако точек.
Я удалил все остальные коды, чтобы протестировать только этот код, и именно этот фрагмент кода для передачи данных вызвал задержку
Такое ощущение, что внутри графического процессора копируется огромное количество данных каждый раз, когда я пытаюсь отобразить данные, из-за которых он зависает. Однако после того, как я перенес данные обратно из графического процессора в оперативную память, данные, которые изначально находились внутри графического процессора, остались нетронутыми. Я думал, что рендеринг должен быть таким же плавным, как и раньше, но это не так.
Изменилось ли что-то в состоянии OpenGL, вызвавшее эту задержку?