我正在使用OpenGL对图像进行调整,因此我需要这种工作流程:
每个步骤都会停止,直到上一步结束。这可以。我需要尽快完成所有这些步骤。与其他操作的复用对我来说不是一个改进;我需要尽快完成这个图像。
现在,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? (我觉得“不”。请告诉我它是不是!)
我是否可以使用一种工具来验证这是我系统的速度,从而证明我的代码是正确的,或者肯定会将责任归咎于我的代码?
答案 0 :(得分:0)
不,我并不是因为期待更高的数据传输率而疯狂。
我的错误是我将数据上传时间设置得太高了抽象级别,所以我无意中将new Uint8Array(image.buffer)
包含在我的时间中。在一个时间里,我看到这个电话需要1190毫秒而glTexImage2D
需要10毫秒。
下次课程:在特定C调用之前和之后的确切行上进行计时。只有这样我才发现问题。
非常感谢@ChristianRau帮助我完成调试。