Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 是否需要在主线程上绘制MTKView或CametLayer?_Macos_Uikit_Metal_Appkit_Metalkit - Fatal编程技术网

Macos 是否需要在主线程上绘制MTKView或CametLayer?

Macos 是否需要在主线程上绘制MTKView或CametLayer?,macos,uikit,metal,appkit,metalkit,Macos,Uikit,Metal,Appkit,Metalkit,众所周知,更新AppKit或UIKit中的用户界面需要在主线程上进行。金属在呈现可拉深时是否有相同的要求 在我一直在玩的一个以NSView为主机的层中,我注意到我可以从一个调度队列调用[CametLayer nextDrawable],该队列不是主队列。然后我可以像往常一样更新可绘制的纹理并呈现它 这似乎工作正常,但我觉得这相当可疑。除非我忽略了文档中的某些内容,否则我找不到Metal的主线程要求(赞成或反对) (我正在macOS 10.13上进行测试,但我假设iOS的主线程要求也一样…?)使用

众所周知,更新
AppKit
UIKit
中的用户界面需要在主线程上进行。金属在呈现
可拉深
时是否有相同的要求

在我一直在玩的一个以
NSView
为主机的层中,我注意到我可以从一个
调度队列
调用
[CametLayer nextDrawable]
,该队列不是
主队列
。然后我可以像往常一样更新可绘制的纹理并呈现它

这似乎工作正常,但我觉得这相当可疑。除非我忽略了文档中的某些内容,否则我找不到Metal的主线程要求(赞成或反对)


(我正在macOS 10.13上进行测试,但我假设iOS的主线程要求也一样…?)

使用后台线程是安全的。他们说:

调用此方法将阻塞当前CPU线程,直到新的可绘制线程可用为止

(重点补充。)如果它只能在主线程上调用,那么它可能不会如此通用。此外,苹果的一般建议是避免阻塞主线程,因此你可能认为他们会以某种方式指出这一事实,比如建议你不要调用它,除非你非常确定它不会阻塞

对于如何使用(而不是获取)drawable,请注意一个典型的用例是调用命令缓冲区的
-presentDrawable:
方法。该方法便于添加计划处理程序块(如通过
-addScheduledHandler:
),然后在绘图页上调用
-present
)。未指定将调用处理程序块的线程或队列,这表明无法保证在主线程上调用drawable上的
-present

即使在这之后,在调用
-present
的过程中,可绘制图形在屏幕上的实际显示也不是同步的。drawable将等待渲染或写入其纹理的任何命令完成,然后才显示在屏幕上。没有具体说明异步性是如何实现的,但它进一步表明,调用哪个线程
-present
并不重要


在中有一些关于多线程的讨论,尽管它不像人们希望的那样直接。特别是看。请注意,这里讨论了由后台线程填充的命令缓冲区,并且没有关于使用Drawable的具体警告。同样,这是一种缺乏证据的论点,但我认为这是清楚的。他们确实指出,一次只能有一个线程作用于给定的命令缓冲区,因此他们正在考虑线程安全问题。

我倾向于同意,即使这与我多年来的AppKit规则背道而驰。MTKView的自动显示循环只调用
drawRect
,这确实发生在主线程上。如果我滚动我自己的“渲染循环”并输出到一个可能托管在
NSView
中的
CametLayer
,听起来我可以渲染到该金属层的
nextDrawable
,而不必同步回主线程。相反,您将如何强制Metal确保当前呈现的纹理与UI同步?(比如当图层的内容需要准确地反映鼠标拖动的位置时。)有关该问题,请参阅文档。将其设置为true,不要调用
-[MTLCommandBuffer presentDrawable:
,而是调用
-waitUntilScheduled
,然后调用
-[MTLDraawable present]
。在这种情况下,您必须在主线程上执行此操作,以与其
CATransaction
同步。啊,我正在执行
waituntlscheduled
present
部分,而不是
presentsWithTransaction
部分。我会把它加进去,再多玩一会儿。