gpt4 book ai didi

c++ - OpenGL更新缓冲区如何影响速度

转载 作者:行者123 更新时间:2023-12-01 14:40:11 27 4
gpt4 key购买 nike

我有一个缓冲区,我映射到要发送的顶点属性。这是代码的基本功能:

glBindBuffer(GL_ARRAY_BUFFER, _bufferID);
_buffer = (VertexData*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);

for(Renderable* renderable : renderables){
const glm::vec3& size = renderable->getSize();
const glm::vec3& position = renderable->getPosition();
const glm::vec4& color = renderable->getColor();
const glm::mat4& modelMatrix = renderable->getModelMatrix();
glm::vec3 vertexNormal = glm::vec3(0, 1, 0);


_buffer->position = glm::vec3(modelMatrix * glm::vec4(position.x, position.y, position.z, 1));
_buffer->color = color;
_buffer->texCoords = glm::vec2(0, 0);
_buffer->normal = vertexNormal;
_buffer++;
}

然后在一次绘制调用中绘制所有可渲染对象。我很好奇为什么触摸 _buffer变量会导致程序严重减速。例如,如果我每帧调用 std::cout << _buffer->position.x;,我的fps就会下降到通常的1/4左右。

我想知道的是为什么要这样做。我想知道的原因是因为我希望能够在移动批处理对象时为其提供翻译对象。本质上,我希望缓冲区始终位于同一位置而不更改,但是我可以在不牺牲性能的情况下进行更改。我认为这是不可能的,但我想知道为什么。这是一个示例,如果没有引起大问题,我将要做什么:
if(renderables.at(index)->hasChangedPosition())
_buffer+=index;
_buffer->position = renderables.at(index)->getPosition();

我知道我可以通过着色器统一发送转换,但是您不能在一个绘制调用中对批处理对象执行此操作。

最佳答案

why touching the _buffer variable at all causes massive slow down in the program



...嗯,您确实请求了 GL_WRITE_ONLY缓冲区; GL驱动程序完全有可能使用自定义的 fault处理程序设置支持 glMapBuffer()返回的指针的内存页,而该处理程序实际上会发送到GPU来获取请求的字节,这可能...不快。

而如果您仅写入提供的地址,则驱动程序/操作系统在 glUnmapBuffer()调用之前无需执行任何操作,此时它可以建立一个不错的快速DMA传输,以将新缓冲区内容一次性传输到GPU内存中。走。

关于c++ - OpenGL更新缓冲区如何影响速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59348630/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com