Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenGL中上传纹理非常慢_Opengl_Direct3d - Fatal编程技术网

在OpenGL中上传纹理非常慢

在OpenGL中上传纹理非常慢,opengl,direct3d,Opengl,Direct3d,我已经编写了一个模拟器,正在移植到Linux。目前我正在使用Direct3D 11制作视频,我正在将其移植到OpenGL(目前我正在Windows上运行)。我渲染一个1024x1024纹理,每一帧我都上传到内存中(原始硬件并不适合现代硬件加速,所以我只是用软件来完成)。然而,我发现在OpenGL中上传纹理要慢得多 在Direct3D中,每帧上载纹理将帧速率从416降至395(下降5%)。在OpenGL中,它从427下降到297(下降了30%) 下面是我的draw函数中的相关代码 Direct3D

我已经编写了一个模拟器,正在移植到Linux。目前我正在使用Direct3D 11制作视频,我正在将其移植到OpenGL(目前我正在Windows上运行)。我渲染一个1024x1024纹理,每一帧我都上传到内存中(原始硬件并不适合现代硬件加速,所以我只是用软件来完成)。然而,我发现在OpenGL中上传纹理要慢得多

在Direct3D中,每帧上载纹理将帧速率从416降至395(下降5%)。在OpenGL中,它从427下降到297(下降了30%)

下面是我的draw函数中的相关代码

Direct3D:

D3D11_MAPPED_SUBRESOURCE resource;
deviceContext_->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource);
uint32_t *buf = reinterpret_cast<uint32_t *>(resource.pData);
memcpy(buf, ...);
deviceContext_->Unmap(texture, 0);
有人能提出是什么导致了这一减速吗


如果可能的话,我正在使用NVIDIA GeForce GTX 550 Ti运行Windows 7 x64。

glTexImage2d进行内存重新分配和更新。尝试改用glTexSubImage2d

GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_无符号字节,textureBuffer)

你在这里做错了几件事。首先,
glTexImage2D
相当于每帧创建一个Direct3D纹理资源。但你不是在创造它;你只是上传到它。每个感兴趣的mipmap层只能使用
glTexImage2D
一次;在此之后,所有上传都应与一起进行

第二,您的(左侧的第三个参数)是
GL\u RGBA
。图像格式应始终使用显式大小。因此,请使用
GL\u RGBA8
。这其实不是个问题,但你现在应该养成这个习惯

第三,您正在使用
GL_RGBA
为您的应用程序排序(右侧的第三个参数,而不是左侧)。这通常不是最理想的像素传输格式,因为许多硬件倾向于选择
GL\u BGRA
顺序。但是,如果你不能从按这个顺序生成数据的任何地方获取数据,那么就没有什么可以做的了

第四,如果在开始上传和使用它进行实际渲染之间,您还有其他事情可以做,那么您可以使用。将数据写入缓冲区对象(可以映射,这样就不必复制到其中)。然后使用
glTexSubImage2D
将此数据传输到OpenGL。因为源数据和目标图像是OpenGL内存的一部分,所以在
glTexSubImage2D
返回之前,它不必将数据从客户端内存中复制出来

当然,这可能不会对您有多大帮助,因为您已经在D3D案例中有效地进行了复制

在OpenGL中,它从427下降到297(下降30%)


更重要的统计数据是,这是一个1毫秒的差。您应该以绝对时间为单位查看计时,而不是以每秒帧数为单位,也不是以每秒帧数的百分比下降为单位。

谢谢您提供了非常有用的答案
glTexSubImage2D
帮助很大;现在最高可达373fps(2.7ms)。BGRA的事情很有趣。实际上,我必须使用BGRA使其显示正确的颜色;我以为这是我搞砸了的事情,是我以后要调查的事情,所以我只是更改了我发布的代码。奇怪的是,从RGBA更改为BGRA会将帧速率降至328(3.0毫秒);为什么会发生这种情况?值得一提的是,渲染成PBO并立即使用它,而不是渲染然后复制将帧速率增加到424。现在需要对D3D渲染器进行更多优化才能赶上进度!
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA,
    GL_UNSIGNED_BYTE, textureBuffer);