1

我有一段时间一直在挣扎的情况。

在对 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以进行后续处理。

4

0 回答 0