是否可以在进程之间共享纹理而无需复制纹理数据?

CJ_*_*ned 4 opengl textures ipc vulkan

我认为它可以使用 Vulkan 的外部内存扩展来工作,方法是在进程 A 中分配内存,创建该内存的句柄,然后通过共享内存将该句柄传递给进程 B。

但这似乎是不可能的,因为 HANDLE 实际上只是一个 void* 并且对于不同的进程存在不同的内存映射,因此指针/HANDLE 实际上不能在进程之间传输

有没有什么方法可以以某种方式获取句柄并在不同的进程中重新创建 GL 纹理/VK 图像,而无需复制所有图像的像素数据(例如使用 PBO 时)?

dat*_*olf 6

要将 a 转移HANDLE到不同的进程,请使用该函数DuplicateHandle,这将创建一个引用同一对象的重复句柄,但在另一个进程中。然后,您必须HANDLE通过 IPC 的某种方式将该新值(在原始进程中不可用)传递给另一个进程。您可以使用共享内存,或发送消息,或 \xe2\x80\xa6 以及任何允许您向其他进程发送整数的sizeof(void*),即以 C a 表示的uintptr_t。然后,您只需将 转换HANDLE为 auintptr_t将该数值发送到另一个进程,然后将其转换回 a HANDLE

\n

您必须手动执行此操作,因为没有适当的机制来告诉一个进程,突然间,一个全新的HANDLE任务上下文被魔法化了。

\n