我编写了一个模拟器,我正在移植到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.
我以固定速率接收大量数据。我需要在不同的线程上对这些数据进行一些处理,但这可能比传入的数据运行得慢,所以我需要缓冲数据。由于可用 RAM 中的数据量很快就会耗尽,因此需要溢出到硬盘上。我可以做的是类似于文件系统支持的管道,因此写入器可能会被文件系统阻止,但不会被运行得太慢的读取器阻止。
这是一组粗略的要求:
Windows 中是否存在这样的机制?
假设我的应用程序正在使用一个Server具有回调的库对象,该回调在与客户端建立新连接时onConnected传递Connection对象的引用; 该Server保留的所有权Connection.我想破坏它Connection何时关闭(无论是本地还是远程),但我不确定如何最好地处理通知正在使用连接的应用程序.
显而易见的解决方案是进行某种onDisconnected回调,或者delete立即进行,允许应用程序在尝试继续使用时崩溃,或者将其传递shared_ptr给对象,直到应用程序清理它为止.这些方法对我来说都不是特别好.前者只是觉得不安全,后者混淆了谁拥有连接的概念,如果应用程序忽略了回调,则可能发生泄漏.
我是否缺少一些惯用的解决方案,或者只是一种更好的方法?