微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GL_DYNAMIC_DRAW 性能峰值

如何解决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 举报,一经查实,本站将立刻删除。