使用 Metal 进行屏幕撕裂和相机捕捉

2024-04-03

为了避免同时从 gpu 和 cpu 写入常量缓冲区,Apple 建议在信号量的帮助下使用三重缓冲系统,以防止 cpu 领先于 gpu 太多(这很好,并在现阶段至少有三个金属视频)。

然而,当常量资源是 MTLTexture 并且 AVCaptureVideoDataOutput 委托与渲染循环 (CADisplaylink) 分开运行时,类似的三缓冲系统(如 Apple 示例代码 MetalVideoCapture 中使用的那样)如何保证同步?如果您采用 MetalVideoCapture 代码并简单地渲染全屏四边形并将预设更改为 AVCaptureSessionPresetHigh(此时撕裂被旋转四边形和低质量预设遮盖),则可以观察到屏幕撕裂(纹理撕裂)。

我意识到渲染循环和 captureOutput 委托方法(在本例中)都在主线程上,并且信号量(在渲染循环中)保持 _constantDataBufferIndex 整数处于检查状态(它索引到 MTLTexture 中以进行创建和编码),但仍然可以观察到屏幕撕裂,这让我感到困惑(如果 GPU 写入的纹理不是编码后的下一帧而是编码后的 2 或 3 帧,那么这是有意义的,但我不认为是这种情况)。另外,还有一点:对于缓冲纹理系统,渲染循环和 captureOutput 不应该具有相同的帧速率,这样旧帧就不会与最近的帧交错渲染。

对于此事的任何想法或澄清将不胜感激; McZonk 还提供了另一个示例,它不使用三重缓冲系统,但我也观察到这种方法会出现撕裂(但情况较少)。显然,如果我使用 waitUntilCompleted(相当于 Open GL 的 glfinish),则不会观察到撕裂,但这就像将一只手臂绑在背后拉手风琴一样!


None

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

使用 Metal 进行屏幕撕裂和相机捕捉 的相关文章

随机推荐

  • 使用查询结果作为表名

    如果我们有如下表 A Table 如何执行涉及以下值的查询A table作为表名 我的意思是这样的 SELECT Table as tbl FROM A SELECT FROM tbl 但在一份声明中 SQLite没有内置的动态构造SQL语
  • Gephi 中的平行边是什么?导入边列表时如何处理它们?

    当我导入 gexf 文件时 它会标记一堆平行边 我不知道什么是平行边以及为什么我的图表存在问题 我正在尝试创建一个动态 gephi 图 如果一对两个节点之间有多条边 这些边彼此平行 因此它们是平行边 Gephi 中无法表示平行边 因此 Ge
  • Github 错误:找不到存储库(是的,还有另一个)

    我在这里搜索并阅读了大多数类似的问题 但似乎没有一个与我的相同 我在 Github 上有一个私人仓库 一个小时前我可以很好地推送 现在 我收到错误 未找到存储库消息 我的 ssh config 中有以下内容 Host github Host
  • GitHub:我为什么要分叉?

    我知道分叉是在服务器端克隆存储库 但我不明白为什么我要这么做 为什么不将原始存储库克隆到我的计算机 添加我的代码 而不是将新分支推送到 GitHub 并发出拉取请求 我知道分叉是在服务器端克隆存储库 差不多是这样吧 在 GitHub 上 分
  • JQuery 将变量从 href 传递到 load()

    我试图在 JQuery 中将 href id 传递给 load 我可以从警报中看到返回的 id 960 所以我知道 id 值已经过去了 我只是不知道如何附加加载 url refreshme add id 是重要的部分 我用它来刷新数据库拉取
  • 检查具有关联的对象

    我有两个模型 其中 A has many B 如果我加载 A 包括关联的 B a A find first include bs a inspect只显示a的属性 gt a 我能怎么做a inspect这样它就会显示所有关联的a bs 默认
  • Android 旋转位图而不进行复制

    有没有办法旋转位图而不复制它 或者也许是保存位图的图像视图 现在我有类似的东西 Bitmap bm BitmapFactory decodeFile get the orientation Matrix m new Matrix m pos
  • Linux 内核的静态调用图生成

    我正在寻找一个工具来静态生成 Linux 内核的调用图 对于给定的内核配置 生成的调用图应该是 完整的 即包含所有调用 包括潜在的间接调用 我们可以假设在 Linux 内核的情况下只能通过使用函数指针来完成调用 例如 这可以通过分析函数指针
  • pytest。使用堆叠参数化装饰器时定义预期结果的最佳方法?

    我有两个类似的测试用例 每个都有超过 100 行代码 这些代码为测试创建辅助对象 这些行非常相似 事实上 测试设置之间只有 2 行不同 我不想删除这些代码重复 我认为多个参数化可能会帮助我完成这项任务 使用多个参数化 我可以将设置组合起来
  • PHP会话文件权限

    我有文件index php
  • WebLogic 和 OSGi

    有没有办法在 Weblogic 应用程序服务器中运行 OSGi 容器 我知道它可以与 JBoss Glassfish 配合使用 并且可以将 Equinox servlet 桥添加到您的 OSGi 项目中 桥的实现太旧了 但我想要类似 JBo
  • npm install packagename --save-dev 不更新 package.json

    有没有简单或微妙的原因package json运行 save dev 后不会更新吗 这是我的命令 npm install modulename save dev 从项目的根目录运行 命令成功 新模块按预期显示在 node modules 目
  • 如何增加TabLayout中选项卡的图标大小

    我正在尝试增加应用程序中选项卡的图标大小 图标大小是固定的 尝试了很多方法 但没有任何效果 最后尝试了以下方法 但大小没有改变 如果有人能告诉我正确的方法 我会很高兴 提前致谢 这是我的代码 Toolbar toolbar Toolbar
  • @TransactionalEventListener 不起作用,因为 @EventListener 对于相同上下文就像魅力一样工作

    我正在从事 Spring Boot 应用程序的事件驱动设计 该代码由以下文件组成 Spring boot ApplicationEvent 文件 即 MyBusinessEvent java Data AllArgsConstructor
  • 有谁知道如何在 Rails 2.3 中正确处理用户时区?

    我们正在构建一个 Rails 应用程序 需要在多个时区显示日期 更重要的是计算日期 谁能告诉我如何在 Rails 2 3 5 或 8 中使用用户时区 我见过的最具包容性的文章详细介绍了用户时区的工作原理 如下 http wiki rubyo
  • 是否可以编辑 JWT 令牌的过期时间?

    我是智威汤逊世界的新手 很高兴在这里获得一些帮助 我有一个应用程序可以与这个出色的解决方案完美配合 但在用户登录我的应用程序时发现延长令牌过期的一个小问题 换句话说 我想在用户每次使用他以前的 JWT 访问我的应用程序时更新过期时间 有没有
  • 通过xmpp在android中传输文件?

    我只是想通过 xmpp 传输文件 我正在使用 asmack lib 我在下面遇到异常 E AndroidRuntime 332 FATAL EXCEPTION main E AndroidRuntime 332 java lang Null
  • useEffect props 回调函数导致无限循环

    我有一个与此非常相似的问题 如何修复 React Hook useEffect 中缺少的依赖项 https stackoverflow com questions 55840294 how do i fix missing dependen
  • 将第二个类添加到 RowDataBound 中的 gridview 行

    我希望以编程方式向 GridView 添加一个附加类 我知道我可以使用以下代码来做到这一点 public void RowDataBound object sender GridViewRowEventArgs e DataRow row
  • 使用 Metal 进行屏幕撕裂和相机捕捉

    为了避免同时从 gpu 和 cpu 写入常量缓冲区 Apple 建议在信号量的帮助下使用三重缓冲系统 以防止 cpu 领先于 gpu 太多 这很好 并在现阶段至少有三个金属视频 然而 当常量资源是 MTLTexture 并且 AVCaptu