代码之家  ›  专栏  ›  技术社区  ›  kennyc

是否需要在主线程上绘制到MTKView或camertalayer?

  •  2
  • kennyc  · 技术社区  · 6 年前

    众所周知,在 AppKit UIKit 要求在主线程上进行。金属在呈现 drawable ?

    在承载的图层中 NSView 我一直在玩,我注意到我可以打电话给 [CAMetalLayer nextDrawable] 从一个 dispatch_queue main_queue . 然后我可以像往常一样更新这个可绘制的纹理并呈现出来。

    这个 出现 工作正常,但我觉得很可疑。除非我忽略了文档中的某些内容,否则我找不到任何关于Metal的主线程要求(支持或反对)。

    (我正在MacOS10.13上测试,但我假设iOS的主线程需求也会相同…?)

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ken Thomases    6 年前

    在背景线上画画是安全的。这个 docs for -nextDrawable

    调用此方法块 当前CPU线程

    (强调补充)如果它只能在主线程上调用,那可能就不会如此普遍。另外,苹果的一般建议是避免阻塞主线程,所以你会认为他们会以某种方式说出这一事实,比如建议你不要调用它,除非你很确定它不会阻塞。

    对于如何使用drawable(而不是获得drawable),请注意,典型的用例是调用命令缓冲区的 -presentDrawable: 方法。该方法便于添加调度处理程序块(如via -addScheduledHandler: )然后会打电话给 -present 在抽屉上。未指定将在哪个线程或队列上调用处理程序块,这表明没有承诺 调用drawable将在主线程上发生。

    -出席 . drawable会一直等到渲染或写入其纹理的任何命令完成,然后才会显示到屏幕上。它没有指定如何实现异步性,但它进一步表明,无论哪个线程 -出席 被召唤。

    Metal Programming Guide the section on Multiple Threads, Command Buffers, and Command Encoders . 注意,这里讨论的是后台线程正在填充命令缓冲区,并且没有关于使用drawables的特定警告。同样,这是一种缺乏证据的论点,但我认为这是清楚的。他们确实指出,一次只有一个线程可以作用于给定的命令缓冲区,因此他们正在考虑线程安全问题。