如何在macOS上使用MTLSharedTextureHandle或MTLSharedEventHandle与C XPC接口?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在macOS上使用MTLSharedTextureHandle或MTLSharedEventHandle与C XPC接口?相关的知识,希望对你有一定的参考价值。

TL; DR:你如何编码和解码MTLSharedTextureHandleMTLSharedEventHandler,以便它可以通过xpc_dictionary内的XPC连接传输?


我正在开发的macOS应用程序广泛使用XPC服务,并使用基于C的API实现。 (即:xpc_main, xpc_connection, xpc_dictionary...)这在当时是有道理的,因为某些物体,如iosurfaces,不支持NSCoding/NSSecureCoding,必须使用IOSurfaceCreateXPCObject传递。

在macOS 10.14中,Apple引入了用于在进程之间共享Metal纹理和事件的新类:MTLSharedTextureHandleMTLSharedEventHandle。这些类支持NSSecureCoding但它们似乎没有在C-XPC接口中具有用于编码/解码它们的对应部分。

我以为我可以使用类似[NSKeyedArchiver archivedDataWithRootObject:requiringSecureCoding:error]的东西将它们转换为NSData对象,然后可以存储在xpc_dictionary中,但是当我尝试这样做时,我得到以下异常:

Caught exception during archival: 
This object may only be encoded by an NSXPCCoder.

(NSXPCCoder是一个私人课程。)

MTLSharedTextureHandleMTLSharedEventHandle都会发生这种情况。我可以切换到使用新的NSXPCConnection API,但我已经在C接口上构建了大量的代码,所以我宁愿不必进行切换。

有没有办法将这两个类中的任何一个存档到有效负载中,可以存储在xpc_dictionary中以便在服务和客户端之间进行传输?

答案

MTLSharedTextureHandle只适用于NSXPCConnection。如果你是从IOSurface创建纹理,你可以共享表面,这实际上是相同的。确保在两个进程中使用相同的GPU(相同的id<MTLDevice>)。

使用公共API的MTLSharedEventHandle没有解决方法。

如果可以,我建议切换到NSXPCConnection。遗憾的是,使用公共API进行部分更改并不是一个好故事,您必须立即执行所有操作或将XPC服务拆分为两个单独的服务。

以上是关于如何在macOS上使用MTLSharedTextureHandle或MTLSharedEventHandle与C XPC接口?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MacOS 上获取文件类型的图标?

如何在 MacOS 上使用 QGLFormat 更改 OpenGL 版本?

如何在 macos 上使用 ssh 密钥访问 github.com?

如何使用 SwiftUI 在 MacOS 上配置多选分段控制

如何在 macOS 上使用 python 将图片发送到打印机

如何使用 SwiftUI 在 macOS 上可靠地检索窗口的背景颜色?