objective-c - 如何在 macOS 上将 MTLSharedTextureHandle 或 MTLSharedEventHandle 与 C XPC 接口一起使用?
问题描述
TL;DR:你如何编码和解码一个MTLSharedTextureHandle
andMTLSharedEventHandler
以便它可以通过一个 XPC 连接在一个内部传输xpc_dictionary
?
我正在开发的一个 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
服务和客户端之间传输的有效负载中?
解决方案
MTLSharedTextureHandle
仅适用于NSXPCConnection
. 如果您从 IOSurface 创建纹理,则可以共享该表面,这实际上是同一件事。确保您id<MTLDevice>
在两个进程中使用相同的 GPU(相同)。
没有MTLSharedEventHandle
使用公共 API 的解决方法。
NSXPCConnection
如果可以的话,我建议切换到。不幸的是,使用公共 API 进行部分转换并不是一个好故事,您必须一次完成所有操作,或者将您的 XPC 服务拆分为两个单独的服务。
推荐阅读
- ansible - 如果第一次失败,Ansible 使用不同的主机名
- ubuntu-16.04 - sudo apt update && sudo apt dist-upgrade 7 未升级
- python - 无法使用 __init__.py 创建模块
- java - 最近 Xodus 版本中的服务提供者接口
- java - JdbcTemplate 插入成功但数据库中没有行
- database - 清除推荐的 wso2 表后,我在发布者-> 分析菜单中丢失了我的分析和统计信息
- python - Pyqt连接到按钮另一个文件中的函数绘制图形
- css - 如何在材质 ui Dialog 组件上添加背景图像
- python - 如何根据日期标准查找熊猫列中前 n 行的平均值?
- .net - 带有 Visual Studio 代码的 F# .net 框架