在MTKViews之间传递纹理的最佳方法是什么?

时间:2017-11-07 15:35:09

标签: metal metalkit

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

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

0 个答案:

没有答案