Опитвах се да изобразя облак от точки (›100 милиона точки), прехвърлих всички данни към GPU и просто използвах името на буфера за достъп до него. Всичко работи добре, докато внедря функция, която изисква от мен да прехвърля всички данни обратно в RAM.
Ето как предавам данните на 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);
След това програмата ще виси всеки път, когато трябва да изобразя този облак от точки.
Премахнах всички други кодове, за да тествам само този код, и тази част от кода за пренос на данни е точно причината за забавянето
Имам чувството, че има огромно количество копиране на данни вътре в графичния процесор всеки път, когато се опитам да изобразя данните, които са го причинили да виси. Въпреки това, след като прехвърлих обратно данните от GPU към RAM, данните, които първоначално бяха в GPU, остават недокоснати, мислех, че изобразяването трябва да е също толкова гладко, колкото преди, но не е така.
Променено ли е нещо в състоянието на OpenGL, което е причинило това забавяне?