1

TL;DR:你如何编码和解码一个MTLSharedTextureHandleandMTLSharedEventHandler以便它可以通过一个 XPC 连接在一个内部传输xpc_dictionary


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

在 macOS 10.14 中,Apple 引入了用于在进程之间共享金属纹理和事件的新类: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 是一个私有类。)

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

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

4

1 回答 1

2

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

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

NSXPCConnection如果可以的话,我建议切换到。不幸的是,使用公共 API 进行部分转换并不是一个好故事,您必须一次完成所有操作,或者将您的 XPC 服务拆分为两个单独的服务。

于 2018-11-26T07:45:27.910 回答