Directx 12 :在两个进程之间共享图形内存
Directx 12 : Sharing graphic memory between two processes
我正在尝试创建两个应用程序。一个应用程序将在屏幕外渲染纹理,第二个应用程序将从图形内存中读取纹理并在窗口中呈现/呈现。
我的疑问是是否可以在 directx 12 中共享图形内存。
我的命名共享内存方法导致 comptr addref 错误...
我正在使用一个 comptr 来ID3D12Resource
纹理数据......
那么我们怎样才能继续采用这种方法呢?
当然可以渲染到屏幕外纹理并在另一个进程中显示它。要显示,您可以调用CopyResource
或CopyTextureRegion
将共享资源复制到Swapchain
的后台缓冲区中,然后显示它。
我不确定你所说的named shared memory approach
是什么意思,但要让进程间内存共享正常工作,你必须:
在进程 A 中:
- 在共享堆中创建资源,例如通过 ID3D12Device::CreateCommittedResource
- 调用 ID3D12Device::在资源上创建共享句柄
在进程 B 中:
- 调用 ID3D12Device::OpenSharedHandleByName 以获取共享句柄(称为 NT 句柄(
- 调用 ID3D12Device::OpenSharedHandle 以从句柄创建资源
快速绘制示例(创建一个缓冲区,但对于纹理来说应该没有任何不同(:
Microsoft::WRL::ComPtr<ID3D12Resource> ptr{};
if (isProcessA) {
HANDLE handle{};
throwIfFailed(device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES{D3D12_HEAP_TYPE_DEFAULT},
D3D12_HEAP_FLAG_SHARED,
&CD3DX12_RESOURCE_DESC::Buffer(1024),
D3D12_RESOURCE_STATE_COMMON,
nullptr,
IID_PPV_ARGS(&ptr)));
throwIfFailed(device->CreateSharedHandle(ptr.Get(), nullptr, GENERIC_ALL, L"Name", &handle));
} else {
HANDLE handle{};
throwIfFailed(device->OpenSharedHandleByName(L"Name", GENERIC_ALL, &handle));
throwIfFailed(device->OpenSharedHandle(handle, IID_PPV_ARGS(&ptr)));
}
请注意,您必须避免传递给 ID3D12Device::CreateCommittedResource 的Name
值发生冲突。
有关进一步的参考,请参阅 MSDN。
相关文章:
- 我们能否在stm32f中使用硬件定时器控制两个独立的进程
- 两个进程可以通过跟踪附加到同一个 PID 吗?
- Directx 12 :在两个进程之间共享图形内存
- 提升消息队列 跨两个进程未接收
- 两个不同的进程,在同一地址上有 2 个 std::atomic 变量?
- 使计时器在C++进程中的特定时间关闭,以便同步两个进程
- 两个并发的 Python 进程可以在 Boost Python 中运行吗?
- 在两个进程之间传递消息
- 两个进程之间的共享映射内存在编辑时未更新
- 在同一台计算机上的两个进程之间使用ROSBridge
- Boost 在两个进程(C 和 C++)之间的managed_shared_memory使用情况
- Boost::ASIO:使用两个进程的双向通信
- 对关键部分的两个进程访问出错
- 如何强制两个进程的执行顺序
- 可以单独调用两个 CreateProcess() 共享相同的启动和进程信息
- 当我使用两个以上的双引号 (\) 时进程未启动
- 两个进程之间共享数组
- 在同一进程中使用的两个模块中具有同步对象的通用名称是否安全
- 从两个进程安全访问文件
- UNIX中两个进程之间通信的最佳方式:一个运行ruby服务器,另一个运行C++客户端