小编spe*_*rcw的帖子

在OpenGL中上传纹理非常慢

我编写了一个模拟器,我正在移植到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);
Run Code Online (Sandbox Code Playgroud)

OpenGL的:

glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA,
    GL_UNSIGNED_BYTE, textureBuffer);
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议可能导致这种放缓的原因吗?

如果它有任何可能性,我使用NVIDIA GeForce GTX 550 Ti运行Windows 7 x64.

opengl direct3d

5
推荐指数
2
解决办法
3345
查看次数

缓冲到硬盘

我以固定速率接收大量数据。我需要在不同的线程上对这些数据进行一些处理,但这可能比传入的数据运行得慢,所以我需要缓冲数据。由于可用 RAM 中的数据量很快就会耗尽,因此需要溢出到硬盘上。我可以做的是类似于文件系统支持的管道,因此写入器可能会被文件系统阻止,但不会被运行得太慢的读取器阻止。

这是一组粗略的要求:

  • 写入不应被阅读器运行太慢而阻塞。
  • 如果数据读取速度足够慢以至于可用 RAM 耗尽,它应该溢出到文件系统。写入磁盘被阻塞是可以的。
  • 如果没有数据可用,读取应该阻塞,除非写入器关闭了流。
  • 如果阅读器能够跟上数据,那么它不应该击中硬盘,因为 RAM 缓冲区就足够了(很好但不是必需的)。
  • 磁盘空间应在数据消耗时(或不久之后)恢复。

Windows 中是否存在这样的机制?

c++ windows buffer pipe

5
推荐指数
1
解决办法
226
查看次数

销毁其他人引用的对象

假设我的应用程序正在使用一个Server具有回调的库对象,该回调在与客户端建立新连接时onConnected传递Connection对象的引用; 该Server保留的所有权Connection.我想破坏它Connection何时关闭(无论是本地还是远程),但我不确定如何最好地处理通知正在使用连接的应用程序.

显而易见的解决方案是进行某种onDisconnected回调,或者delete立即进行,允许应用程序在尝试继续使用时崩溃,或者将其传递shared_ptr给对象,直到应用程序清理它为止.这些方法对我来说都不是特别好.前者只是觉得不安全,后者混淆了谁拥有连接的概念,如果应用程序忽略了回调,则可能发生泄漏.

我是否缺少一些惯用的解决方案,或者只是一种更好的方法?

c++

1
推荐指数
1
解决办法
69
查看次数

标签 统计

c++ ×2

buffer ×1

direct3d ×1

opengl ×1

pipe ×1

windows ×1