GlTexSubImage2D速度慢,占用CPU的4%

guy*_*erg 2 c++ opengl

我使用glTexSubImage2D用于使用openGL的更新窗口.

我看到这个函数需要花费很多时间才能返回,它也占用了4%的CPU.

这是我使用的代码:

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, (*i)->getTextureID());
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, (*i)->getWidth(), (*i)->getHeightView(),
    GL_BGRA, GL_UNSIGNED_BYTE,(*i)->getBuffer());
Run Code Online (Sandbox Code Playgroud)

有人知道更好的实施吗?性能更好的东西会占用更少的CPU?

现在这让我的节目变得迟钝.

Nic*_*las 6

有些事情你可以做,虽然你可以从中受益多少取决于具体情况.

首先,确保您的像素上传格式符合驱动程序的需要.您似乎已经处理好了GL_BGRA, GL_UNSIGNED_BYTE,这可能是驱动程序首选的GL_RGBA8图像格式格式.

但是,如果您碰巧有权访问OpenGL 4.3或实现ARB_internalformat_query2的驱动程序,您实际上可以在运行时检测首选的上载格式.像这样:

GLint pixelFormat, pixelType;
glGetInternalFormativ(GL_TEXTURE_2D, GL_RGBA8, GL_TEXTURE_IMAGE_FORMAT, 1, &pixelFormat);
glGetInternalFormativ(GL_TEXTURE_2D, GL_RGBA8, GL_TEXTURE_IMAGE_TYPE, 1, &pixelType);
Run Code Online (Sandbox Code Playgroud)

当然,这意味着您需要能够修改数据生成方法以生成上述格式/类型对中的数据.

一旦您采取措施来安抚驱动程序,您的下一个可能性就是使用缓冲区对象来存储像素传输数据.这可能无助于整体性能,但它可以减轻CPU负担.

但是,为了充分利用这一点,您需要能够通过映射将 "像素数据""直接"生成到缓冲区对象的内存中.如果你能够做到这一点,那么你可能会收回一些上传的CPU成本.否则,它可能不值得.

如果这样做,您应该使用适当的缓冲区对象流技术.

双缓冲纹理也可能有所帮助.也就是说,当您从一个纹理对象进行渲染时,您将上传到另一个纹理对象.这将防止等待先前渲染完成的GPU停顿.这有多大帮助取决于你的呈现方式.

如果不了解您的应用程序的具体情况,可以说更多.