众所周知,在更新
在我玩耍的一个层主持的
这似乎可以正常工作,但我觉得这相当可疑。除非我在文档中忽略了什么,否则我找不到关于Metal主线程要求的任何提及(无论是支持还是反对)。
(我正在macOS 10.13上测试,但我认为iOS的主线程要求也是相同的...?)
AppKit
或UIKit
用户界面时,必须在主线程上进行。当涉及到呈现drawable
时,Metal是否有相同的要求?在我玩耍的一个层主持的
NSView
中,我注意到我可以从不是main_queue
的dispatch_queue
中调用[CAMetalLayer nextDrawable]
。然后我可以像往常一样更新该drawable的纹理并呈现它。这似乎可以正常工作,但我觉得这相当可疑。除非我在文档中忽略了什么,否则我找不到关于Metal主线程要求的任何提及(无论是支持还是反对)。
(我正在macOS 10.13上测试,但我认为iOS的主线程要求也是相同的...?)
drawRect
,这确实发生在主线程上。如果我自己编写“渲染循环”并输出到可能托管在NSView
中的CAMetalLayer
,那么似乎我可以渲染到该金属层的nextDrawable
而无需返回主线程进行同步。相反,您如何强制Metal确保当前呈现的纹理*与UI同步?(例如,当图层内容需要准确反映鼠标拖动的位置时。) - kennyc-[CAMetalLayer presentsWithTransaction]
的文档。将其设置为 true,不要调用-[MTLCommandBuffer presentDrawable:]
,而是先调用-waitUntilScheduled
,然后再调用-[MTLDrawable present]
。在这种情况下,您需要在主线程上执行此操作以与其CATransaction
同步。 - Ken ThomaseswaitUntilScheduled
和present
这两个部分了,但是没有做presentsWithTransaction
部分。我会加上去并再试一下。 - kennyc