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