问题描述
我正在使用 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 (将#修改为@)