OpenGL VBO会泄漏到CPU RAM吗?



我正在使用glGenBuffers在GPU上创建大量的STATIC_DRAW对象(地形,城镇和树木)。我在程序开始时上传它们,最后删除。当我在 GPU 上分配缓冲区时,我的 CPU RAM 使用率会持续增长。从大约 700 MB 开始,它达到 2 GB。似乎当我创建缓冲区时,它们同时存储在 GPU 和 CPU 中。我没有使用动态分配的内存。下面是一些代码:

for(auto& S : mW.Set) { //Iterates through every SETtlement in the mainWorld
    float F[24] = {-0.5, 0.5, 0.5,     -0.5, -0.5, 0.5,     0.5, -0.5, 0.5,     0.5, 0.5, 0.5,
                -0.5, 0.5, -0.5,    -0.5, -0.5, 0.5,     0.5, -0.5, 0.5,     0.5, 0.5, 0.5}; //8 vertices - defining a cube
    unsigned short I[30] =  {0, 1, 2, 0, 2, 3,
                            0, 1, 4, 0, 4, 5,
                            0, 3, 7, 0, 4, 7,
                            2, 3, 6, 3, 6, 7,
                            1, 2, 5, 2, 5, 6}; //30 indices - bottom face deliberately missing
    for(int i=0; i<24; ++i) { //Manual scaling and translation of the object
        if(((i + 1) % 3) == 1) {
            F[i] *= S->MapSize;
            F[i] += S->X;
        }
        else if(((i + 1) % 3) == 2) {
            F[i] *= S->MapSize;
            F[i] += S->Y;
        }
        else if(((i + 1) % 3) == 0) {
            F[i] *= .1;
            F[i] += (mW.GTile[S->X][S->Y].Point[0]->Position.Z + mW.GTile[S->X][S->Y].Point[1]->Position.Z + mW.GTile[S->X][S->Y].Point[2]->Position.Z + mW.GTile[S->X][S->Y].Point[3]->Position.Z) / 4;
            F[i] += 0.5;
        }
    }
    glGenBuffers(1, &S->buffObj.Array); //Each Settlement (S) object has a buffObj struct which contains a GPU pointer to the vertices and indexes
    glBindBuffer(GL_ARRAY_BUFFER, S->buffObj.Array);
    glBufferData(GL_ARRAY_BUFFER, sizeof(F), F, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glGenBuffers(1, &S->buffObj.Index);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, S->buffObj.Index);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(I), I, GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
} //Every for loop iteration it leaks heavily
//The whole for loops takes 1-2 seconds of execution, and adds around 300 MB of CPU RAM usage, which is very hard to explain, since there is no permanent allocation of memory in the RAM, just in the VRAM. 

我正在使用C++,VS2012和OpenGL 3.3。

驱动程序可以自由决定 VBO 的存储位置,并可以根据需要自由移动它。

这意味着每次对glBufferData的调用都可能malloc一个缓冲区,并且数据在那里被内存复制,直到在复制到GPU RAM时需要绘制调用(之后可以从RAM中清除/缓冲区可以重用)。提示告诉驱动程序,您不打算使用 glGetBufferSubData 再次读出数据或使用 glBufferSubData 更改数据,但如果您执行其中任何一个,它仍然应该准备就绪。

最新更新