glTexImage2D可以达到什么样的数据速率?

时间:2013-04-16 09:43:43

标签: opengl

我正在使用OpenGL对图像进行调整,因此我需要这种工作流程:

  1. 将图像数据上传到显卡
  2. 转换图片
  3. 将结果下载回主存储器
  4. 每个步骤都会停止,直到上一步结束。这可以。我需要尽快完成所有这些步骤。与其他操作的复用对我来说不是一个改进;我需要尽快完成这个图像。

    现在,2非常快,3不是很糟糕,很可能是因为结果是原始图像的缩略图 - 非常小。

    1是我的瓶颈。我测量在1.2秒内上传20MB的图像数据。这让我有点像16MB / s。在互联网的其他地方,我读到了人expecting 5.5GB/s, and being disappointed by 2.5GB/s

    如果我直接使用glTexImage2D或通过PBO执行此操作,则无关紧要。我试过了两个,并没有测量到差异。这是有道理的,因为我没有与任何东西多路复用。对于我的管道,无论如何我都无法立即停止使用PBO。

    我能想到的其余解释是:我的系统就是这么慢。我的显卡是NVIDIA GPU GeForce GTX 285(GT200),通过16x PCI-Express连接。我的测量速度是否达到16MB / s,或者我忽视了什么?是否存在允许我测量最大数据速率的实用程序(通常用于Ubuntu / Linux)?

    我觉得系统这么慢是不舒服的;毕竟,我的网络接口速度非常快(1Gb / s~125MB / s),并且只有cat-5e电缆才能实现这一目标。


    更多细节:glTexImage2D案例非常简单:

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width, image.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rawData);
    

    仅此时间线的测量时​​间约为1200毫秒。

    我还将其翻译为使用PBO,如上所述:

    GLuint pbo = 0;
    glGenBuffers(1, &pbo);
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
    glBufferData(GL_PIXEL_UNPACK_BUFFER, data_size, pixels, GL_STREAM_DRAW);
    glTexImage2D(target, level, internalformat, width, height, border, format, type, 0);
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
    glDeleteBuffers(1, &pbo);    
    

    我也尝试过记忆映射:

    glBufferData(GL_PIXEL_UNPACK_BUFFER, data_size, 0, GL_STREAM_DRAW);
    GLubyte* ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
    std::copy(pixels, pixels+data_size, ptr);
    glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
    

    任何解决方案之间的时间安排没有明显差异。


    上传纹理数据时,我应该期望什么样的数据速率?

    我的设置是否合理16MB / s? (我觉得“不”。请告诉我它是不是!)

    我是否可以使用一种工具来验证这是我系统的速度,从而证明我的代码是正确的,或者肯定会将责任归咎于我的代码?

1 个答案:

答案 0 :(得分:0)

不,我并不是因为期待更高的数据传输率而疯狂。

我的错误是我将数据上传时间设置得太高了抽象级别,所以我无意中将new Uint8Array(image.buffer)包含在我的时间中。在一个时间里,我看到这个电话需要1190毫秒而glTexImage2D需要10毫秒。

下次课程:在特定C调用之前和之后的确切行上进行计时。只有这样我才发现问题。

非常感谢@ChristianRau帮助我完成调试。