TL; DR::如何对MTLSharedTextureHandle
和MTLSharedEventHandler
进行编码和解码,以便可以在xpc_dictionary
内部通过XPC连接进行传输?
我正在使用的macOS应用程序大量使用XPC服务,并使用基于C的API来实现。 (即:xpc_main, xpc_connection, xpc_dictionary...
)在当时是有道理的,因为某些对象(例如IOSurfaces
)不支持NSCoding/NSSecureCoding
,而必须使用IOSurfaceCreateXPCObject
进行传递。
在macOS 10.14中,Apple引入了用于在进程之间共享金属纹理和事件的新类:MTLSharedTextureHandle
和MTLSharedEventHandle
。这些类支持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
都会发生这种情况。我可以切换到使用新的NSXPCConnection
API,但是我已经在C接口上构建了大量代码,因此我宁愿不必进行切换。
是否可以将这两个类中的任何一个存档到有效载荷中,该有效载荷可以存储在xpc_dictionary
中以在服务和客户端之间进行传输?
答案 0 :(得分:0)
MTLSharedTextureHandle
仅适用于NSXPCConnection
。如果要从IOSurface创建纹理,则可以共享表面,实际上这是同一件事。确保在两个进程中使用相同的GPU(id<MTLDevice>
)。
使用公共API的MTLSharedEventHandle
没有解决方法。
如果可以的话,我建议切换到NSXPCConnection
。不幸的是,对于使用公共API进行部分转换并没有一个好故事,您必须一次完成所有操作,或者将XPC服务拆分为两个单独的服务。