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

问题描述 投票:0回答:1

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中以便在服务和客户端之间进行传输?

objective-c macos metal xpc nsxpcconnection
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.