我编写了一个模拟器,正在将其移植到Linux。目前为了显示视频,我正在使用Direct3D 11,并将其移植到OpenGL(暂时在Windows上运行)。我渲染到一个1024x1024的纹理中,每帧都上传到内存中(原始硬件不太适合现代硬件加速,所以我全部使用软件来处理)。然而,我发现在OpenGL中上传纹理要慢得多。
在Direct3D中,每帧上传纹理会导致帧率从416降至395(下降5%)。在OpenGL中,它从427下降到297(下降30%!)。
以下是我的绘制函数中相关代码。
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);
OpenGL:
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA,
GL_UNSIGNED_BYTE, textureBuffer);
有人能建议一下是什么原因导致了这个减速吗?
如果有帮助的话,我正在运行Windows 7 x64,并且使用NVIDIA GeForce GTX 550 Ti。
glTexSubImage2D
对我帮助很大,现在帧率已经达到了373 fps(2.7毫秒)。关于BGRA的问题很有趣。实际上,我必须使用BGRA才能显示正确的颜色;我原以为这是我搞砸了的问题,打算稍后再去研究一下,所以我只是改变了我发布的代码。奇怪的是,从RGBA更改为BGRA会将帧速率降至328(3.0毫秒);这可能是为什么呢? - spencercw