我有一段时间一直在挣扎的情况。
在对 a 的draw:
调用中MTKView
,我生成了 a MTLTexture
,它是该视图的可绘制对象的渲染链的一部分。现在,我想使用该纹理作为在辅助中绘制的基础MTKView
。
为了防止在修改应用程序菜单时出现动画卡顿,我将两个视图都配置为显式绘制模式,并将CVDisplayLink
这些绘制调用分派到串行队列中(即不在主线程上)。我什至尝试将辅助视图配置为使用 setNeedsDisplay 在主队列上绘制。
我可以让它大部分工作,但由于我怀疑是一些线程问题,我偶尔会收到崩溃。我什至甚至将这两个的绘图调用MTKViews
连续放置在同一个串行线程(通过dispatch_queue_async
)上,但没有取得多大成功。我还尝试将生成MTLTexture
的数据放入一个受信号量保护的小 FIFO 队列中,辅助视图从该队列中消费——同样,没有太大成功。
以全动态视频帧为源,事情会顺利运行几分钟,然后draw
在第二个视图的方法中我收到崩溃。通常,当我去检索纹理时会发生这种情况:
id<MTLTexture>inputTexture = [textureQueue firstObject];
// EXC_BAD_ACCESS (code=1, address=0x40dedeadbec8)
有时,我最终会放弃绘制纹理,因为纹理是MTLTextureType1D
(而不是 2D)或者它的使用是错误的MTLTextureUsageShaderRead
。然而我MTLTextureDescriptor
的很好;就像我说的,在 99.99% 的情况下,一切都运行良好。
我想知道是否有人可以协助以适当的、线程安全的方式获取一个纹理MTKView
并将其传递给辅助节点MTKView
以进行后续处理。