GL_DYNAMIC_DRAW 性能峰值

问题描述

我正在使用 C++ 和 OpenGL 开发我自己的游戏引擎,目前正在开发 UI。因为我希望 UI 可以在不同的屏幕上很好地缩放,所以每次有一个窗口时,它都会将一些顶点数据替换到缓冲区中,从而使宽度保持一致。

void UICanvas::windowResize(int width,int height) {
    for (std::vector<int>::iterator itr = wIndices.begin(); itr != wIndices.end(); itr++) {
        UIWindow& window = uiWindows.at(*itr);
        float newX = window.size.x / (100.0f * (*aspectRatio));
        float newY = window.size.y / 100.0f;

        float newPositions = {
            newX,0.0f,newX,-newY
        };

        glBindBuffer(GL_ARRAY_BUFFER,window.positions_vbo);
        std::chrono::high_resolution_clock::timepoint start,end;
        for (int i = 0; i < 1000; i++) { //For benchmarking purposes
            start = std::chrono::high_resolution_clock::Now();
            glBufferSubData(GL_ARRAY_BUFFER,16,&newPositions[0]);
            end = std::chrono::high_resolution_clock::Now();
            //The duration of glBufferSubData is all I care about
            printEvent("windowResize",start,end); //Outputs to json for profiling
        }
    }
}

知道它会偶尔更新,我知道我应该使用 GL_DYNAMIC_DRAW。然而,我想自己衡量差异,而不是仅仅听取人们的意见。对于 GL_DYNAMIC_DRAW,大多数调整大小函数调用是 3-5 微秒,偶尔有 180-200 微秒的稳定尖峰,甚至更稀疏的尖峰高达 4 毫秒,是正常值的 1000 倍。 GL_STATIC_DRAW,虽然平均值为 7-13 毫秒,但仅达到 100-150 微秒,但几乎很少。我知道有数以千计的因素会影响基准测试,比如 cpu 缓存值,或者优化某些东西,但如果 STATIC_DRAW 遵循相同的巨大尖峰模式,它几乎会更有意义。我想我在某处读到动态缓冲区存储在 VRAM 中,而静态缓冲区存储在常规 RAM 中,但这会是这种行为的原因吗?如果我使用 DYNAMIC_DRAW,它会不会偶尔出现尖峰,还是因为重复调用

编辑:抱歉,如果这令人困惑,但代码中的 for 循环是我的测试方法,我一遍又一遍地循环相同的确切函数,并且仅对缓冲区子数据计时,因为这就是我正在寻找的地方STATIC_DRAW 和 DYNAMIC_DRAW 的区别。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)