如何在macOS上使用MTLSharedTextureHandle或MTLSharedEventHandle与C XPC接口?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在macOS上使用MTLSharedTextureHandle或MTLSharedEventHandle与C XPC接口?相关的知识,希望对你有一定的参考价值。
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引入了用于在进程之间共享Metal纹理和事件的新类: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
中以便在服务和客户端之间进行传输?
MTLSharedTextureHandle
只适用于NSXPCConnection
。如果你是从IOSurface创建纹理,你可以共享表面,这实际上是相同的。确保在两个进程中使用相同的GPU(相同的id<MTLDevice>
)。
使用公共API的MTLSharedEventHandle
没有解决方法。
如果可以,我建议切换到NSXPCConnection
。遗憾的是,使用公共API进行部分更改并不是一个好故事,您必须立即执行所有操作或将XPC服务拆分为两个单独的服务。
以上是关于如何在macOS上使用MTLSharedTextureHandle或MTLSharedEventHandle与C XPC接口?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MacOS 上使用 QGLFormat 更改 OpenGL 版本?
如何在 macos 上使用 ssh 密钥访问 github.com?
如何使用 SwiftUI 在 MacOS 上配置多选分段控制