绘制到 MTKView 或 CAMetalLayer 是否需要在主线程上进行?

2024-01-08

众所周知,更新用户界面AppKit or UIKit需要在主线程上进行。 Metal 在呈现时是否有相同的要求?drawable?

在层托管中NSView我一直在玩,我注意到我可以打电话[CAMetalLayer nextDrawable] from a dispatch_queue那不是main_queue。然后我可以像往常一样更新该可绘制的纹理并呈现它。

This appears正常工作,但我发现这很可疑。除非我忽略了文档中的某些内容,否则我找不到任何提及 Metal 的主线程要求的内容(无论是支持还是反对)。

(我正在 macOS 10.13 上进行测试,但我假设 iOS 的主线程要求也是相同的......?)


在后台线程上绘图是安全的。这文档用于-nextDrawable https://developer.apple.com/documentation/quartzcore/cametallayer/1478172-nextdrawable say:

调用此方法会阻塞当前CPU线程直到有新的可绘制对象可用。

(强调。)如果它只能在主线程上调用,那可能就不会那么普遍了。另外,Apple 的一般建议是避免阻塞主线程,因此您可能会认为他们会在这里以某种方式指出这一事实,例如建议您不要调用它,除非您非常确定它不会阻塞。

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

即使在那之后,可绘制对象在屏幕上的实际呈现在调用中也不是同步的-present。可绘制对象会等待任何渲染或写入其纹理的命令完成,然后才会呈现在屏幕上。它没有指定如何实现异步性,但它进一步表明什么线程并不重要-present被召唤。

有一些关于多线程的讨论金属编程指南 https://developer.apple.com/library/archive/documentation/Miscellaneous/Conceptual/MetalProgrammingGuide/Introduction/Introduction.html,尽管它并不像人们希望的那么直接。特别参见关于多线程、命令缓冲区和命令编码器的部分 https://developer.apple.com/library/archive/documentation/Miscellaneous/Conceptual/MetalProgrammingGuide/Cmd-Submiss/Cmd-Submiss.html#//apple_ref/doc/uid/TP40014221-CH3-SW6。请注意,这里讨论了后台线程填充的命令缓冲区,并且没有关于使用可绘制对象的具体警告。再说一遍,这是缺乏证据的争论,但我认为这是明确的。他们确实指出,一次只能有一个线程对给定的命令缓冲区执行操作,因此他们正在考虑线程安全问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

绘制到 MTKView 或 CAMetalLayer 是否需要在主线程上进行? 的相关文章

  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • OSX bash 最小化窗口

    在 Mac 中并使用 bash shell 我想执行一个包含单个命令 启动 Jupyter Lab 的文件并立即最小化终端窗口 有没有办法在不安装第三方软件的情况下做到这一点 是的 只需使用osascript https ss64 com
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • 使用 Cocoa 获取无法安装的驱动器列表

    我想获取在 OS X 下使用 Cocoa Objective C 无法安装 弹出的驱动器列表 我希望 NSWorkspace getFileSystemInfoForPath 能帮助我 NSArray listOfMedia NSWorks
  • 错误:执行 gem 时... (Gem::FilePermissionError)

    我检查了所有其他类似的答案 没有一个与我的完全一样 这些解决方案也不适合我 gem environment and sudo gem environment给出相同的结果 RubyGems Environment RUBYGEMS VERS
  • 警告:找不到模板 /usr/local/git/share/git-core/templates

    我收到这个错误警告 找不到模板 usr local git share git core templates当我在本地存储库中克隆存储库时这个链接 https github com zikula modules Scribite issue
  • 如何在Mac上使用AVFoundation将图片编码为H264,而不是使用x264

    我正在尝试制作一个 Mac 广播客户端 使用 FFmpeg 但不使用 x264 库编码为 H264 所以基本上 我可以从 AVFoundation 中获取原始帧CMSampleBufferRef or AVPicture 那么有没有一种方法
  • 使用 Webkit 的调试版本运行 Safari

    我通过运行以下命令编译了 webkit 的调试版本 工具 脚本 build webkit debug 成功构建后 我尝试通过运行以下命令来使用已编译的 Webkit 调试版本来运行 safari sudo Tools Scripts run
  • xcode 4 垃圾收集已删除?

    我正在学习 Xcode 和 Objective C 但是我正在阅读的书使用的是旧版本 3 2 的 Xcode 其中一章完全致力于内存和泄漏 说我需要通过 项目设置 gt 构建 打开垃圾收集 但是 我找不到垃圾收集设置 它已被删除还是我只是错
  • Mac OSX 10.6 上的 Python mysqldb 不工作

    我正在使用 Python 2 7 并尝试让 Django 项目在 MySQL 后端运行 我已经下载了 mysqldb 并按照此处的指南进行操作 http cd34 com blog programming python mysql pyth
  • Spyder 无法启动:spyder:找不到命令

    我已经安装了spyderpip3 install spyder在苹果电脑上 但是 当我无法从 bash 启动它时 它会显示spyder command not found 我已按照其说明进行操作Github页面 https github c
  • 使用不同的苹果帐户更新 XCODE

    我的操作系统是 MAC 10 7 3 xcode 4 3 1 使用不同的 apple id 安装 因为我的 macbook pro 以前被我的朋友使用过 现在 当我尝试将 Xcode 升级到 4 3 2 时 它会询问我朋友帐户的凭据 不幸的
  • 如何为整个 iOS 应用程序设置自定义字体而不指定大小

    我正在尝试在整个我的应用程序中应用自定义字体iOS app 我发现我可以使用 UILabel appearance setFont UIFont fontWithName Proxima Nova size 17 0 设置所有的默认字体和大
  • 有 Mac 版的 IE 测试器吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 MLMediaLibrary 中加载媒体源时出错

    我在加载时遇到错误mediaSourcesMac OS X 中的属性 我正在尝试使用以下方法获取 Apple Photos 源MLMediaLibrary class 我的应用程序是沙盒的 并且具有图片文件夹的只读权限 我收到错误 MLMe
  • 使用 Homebrew 安装 Git 时出现问题 [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Homebrew 升级 Git 时出现问题 https stackoverflow com questions 12362021 problems upgrading git with home
  • 为什么 tkinter 在 Mac 上失败

    我在 Mac 上使用 tkinter 但是当我使用以下简单代码时 计算机将重新启动 import tkinter as tk window tk Tk 问题是什么 谢谢你 Mac 莫哈韦沙漠 版本 10 14 6 tkinter 版本 8
  • Maven:无法在 OS X 上找到 java.lang 问题

    当我尝试时遇到以下问题mvn clean install显然它无法找到运行时 jar 但我需要做什么 错误日志 ERROR COMPILATION ERROR INFO ERROR Failure executing javac but c
  • Mysql启动问题|错误!服务器退出而不更新PID文件

    有任何想法吗 Joshs MacBook Pro cdwhp joshc mysql server start Starting MySQL ERROR The server quit without updating PID file u
  • SMCopyAllJobDictionaries 和 SMJobCopyDictionary 已弃用,那么它们的替代品是什么?

    I use SMCopyAllJobDictionaries and SMJobCopyDictionary检查应用程序是否是 Mac 中的登录项 但在 10 10 中 它们已被弃用 那么他们官方推荐的替代品是什么 还没有 引用Servic

随机推荐

  • 使用 Spring 设计 Java 库

    我正在将现有程序中的一些功能提取到一个单独的库中 该程序使用 Spring 进行依赖注入和其他任务 我也想继续在库中使用它 该库需要监视文件系统的更改 因此它将启动某种单独的线程来执行此操作 我真的不知道我的库初始化选项是什么 如何初始化库
  • 如何使用 selenium webdriver 自动化基于 Flash 的页面

    我是一名测试员 我们使用一种工具 其中包含使用 Flash 开发的页面 我需要自动化一些出于测试目的而重复的任务 我了解 Selenium Web 驱动程序 但我无法检查这些闪存页面上的任何元素 请帮助我解决这个问题 我玩过闪存硒 http
  • 如何使用 Socket 获取 Asterisk 服务器的状态 - Python

    我试图使用 python 套接字获取 Asterisk 服务器的状态 但没有任何反应 这是我的代码 import socket s socket socket socket AF INET socket SOCK STREAM HOST 1
  • 输出文件时使用Powershell环境变量作为字符串

    我在用获取 WindowsAutopilotInfo https www powershellgallery com packages Get WindowsAutoPilotInfo 3 5生成计算机的序列号和哈希代码并将该信息导出为 C
  • 在 CI/CD 中如何管理前端和后端之间的依赖关系?

    我将描述我的设置 以使问题不那么抽象 但它们似乎并不针对我的情况 Context 我们有 Python Django 后端和 VueJS 前端 每个都位于存储库中 并使用 Portainer 使用堆栈 配置和部署 Gitlab CI 每个存
  • F#:let mutable 与 ref

    首先 我承认这个问题可能是重复的 请告诉我 我很好奇当需要可变性时 一般的 最佳实践 是什么 F 似乎为此提供了两种工具 let mutable绑定 它的工作方式似乎类似于 大多数 语言中的变量 以及引用单元格 使用ref函数 需要显式解除
  • 在 Idris 中证明如果 n = m 且 m = o,则 n + m = m + o?

    我正在尝试通过查看一些练习来提高我的伊德里斯技能软件基础 https softwarefoundations cis upenn edu lf current toc html 最初是为 Coq 设计的 但我希望对 Idris 的翻译不会太
  • 为什么 QToolTips 不会出现在 QMenu 内的 QActions 上

    我正在用 GUI 编写一个应用程序PySide 我设置了一个QMenu on a QPushButton 添加了几个QActions via QMenu addAction 为了进一步向我添加的用户解释这些操作QToolTip与这些QAct
  • 64 位应用程序启动 32 位进程

    我正在开发一个使用 Net 4 0 C 编码的 64 位应用程序 在此应用程序中 在某些时候 我需要启动另一个exe使用以下代码创建文件 l process StartInfo FileName sFullFilePath l proces
  • iOS WKWebView 服务工作者

    从 iOS 15 开始 appCache 被禁用 所以我正在寻找替代方案 是否有启用 WKWebView Service Workers 的官方方法 我知道你可以添加 info plist 键WKAppBoundDomains然后通过实例化
  • 离子选项卡和侧面菜单历史记录

    我想在侧面菜单应用程序内放置一个选项卡式视图 但只是在应用程序的某些视图中 在应用程序中有以下状态结构 Login login menuContent Orders list app orders menuContent Descripti
  • 更改 Qt QML 中按钮的字体大小

    如何在 QML 中设置 Button 控件中文本的字体大小 设计者没有选择 并且 font 不是 Button 的有效属性 Button id cmdQuit text qsTr Quit width 64 height 32 您设置按钮的
  • Firebase v9 上传图片仅显示 9 个字节

    我使用 React Native 和 Firebase v9 将图像上传到 Firebase 在 firebase 存储中 文件已上传 但大小只有 9 个字节 因此无法正常打开 我不知道如何解决这个问题 S const uploadFile
  • DELPHI - 如何更改 VCL 表单应用程序中的 TButton 背景颜色?

    在我的 Delphi VCL 表单应用程序中 我必须更改 TButton 的背景颜色 有没有办法在不使用第三方组件的情况下应用此更改 Thanks 你不能改变 a 的颜色TButton http docwiki embarcadero co
  • 插件 org.jetbrains.android 无法保存设置并已被禁用

    启动 Android Studio 1 2 时 我收到错误消息 插件 org jetbrains android 无法保存设置并已 残疾人 我尝试重新启动 甚至下载了最新的 Android 插件 但没有帮助 有什么建议么 我遇到了同样的问题
  • C# 获取给定路径的文件夹深度的最佳方法?

    我正在做一些需要遍历文件系统的事情 对于任何给定的路径 我需要知道我在文件夹结构中的 深度 这是我目前正在使用的 int folderDepth 0 string tmpPath startPath while Directory GetP
  • 通过服务有角度地加载本地json文件

    我正在尝试在与我的服务文件相同的目录中加载本地 json 文件 没有 JS 错误 在 Net 选项卡下 我可以看到 json 文件已加载 然而 将响应 txt 设置为 var static obj 不会加载 JSON 数据 当我将 JSON
  • 如何在 jQuery 中捕获 COMMAND+S?

    我正在开发一个网络应用程序 我试图让 CTRL S 和 COMMAND S 作为保存的快捷键 我看过http www openjs com scripts events keyboard shortcuts http www openjs
  • HTML - 单击按钮会导致列表因未知原因滚动到顶部

    我正在使用 tampermonkey 添加一些自定义按钮Unity文档 https docs unity3d com Manual 我注意到一个奇怪的问题如果我使用 html
  • 绘制到 MTKView 或 CAMetalLayer 是否需要在主线程上进行?

    众所周知 更新用户界面AppKit or UIKit需要在主线程上进行 Metal 在呈现时是否有相同的要求 drawable 在层托管中NSView我一直在玩 我注意到我可以打电话 CAMetalLayer nextDrawable fr