问题标签 [iosurface]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
142 浏览

macos - 当我的所有表面都在 GPU 上时,为什么 CoreImage 会执行 memcpy

在尝试调试为什么某些 CoreImage 渲染显着增加了我们的 CPU 使用率时,我可以在示例跟踪中看到,当我以某些方式裁剪和合成图像时,CoreImage 正在执行 memcpys。当我取出裁剪过滤器时,它就消失了。我将它用于实时 2D 视频管道,所以这不好。

我所有的图像都在 GPU 上,所以我很难理解它在 CPU 上复制了什么。

任何人都知道这可能会做什么?

更新:

这是包含裁剪的渲染管道。这个使用大量的 CPU 和上面的 memcpy。所有的来源都是 IOSurfaces。它正在拍摄两张图像并进行分屏:

-

如果我取出作物,这是不使用 CPU 的管道,并且不会沿着 surfaceForROI 路径走:

0 投票
0 回答
84 浏览

ios - “kCGContextTypeIOSurface”类型的 CGContext

如何初始化/创建“kCGContextTypeIOSurface”类型的 CGContext?

0 投票
0 回答
745 浏览

ios - 如何获得 MTLTexture 内容的一致深拷贝?

MTLTexture 深拷贝伪影

CMSampleBuffer在我的系统广播扩展中接收到 YUV 420 的屏幕,但是当我尝试访问底层字节时,我得到不一致的结果:伪影是(似乎)过去和未来帧的混合。我正在访问字节以便将纵向框架旋转四分之一圈到横向,但问题减少到无法正确复制纹理。

人工制品的图案可以改变很多。它们可能遍布各处,并且似乎具有基本的“刷子形状”,即方形瓷砖,有时小,有时大,这似乎取决于手头的失败工作。它们可以同时出现在亮度和色度通道中,从而产生有趣的效果。人工制品的“颗粒”有时看起来是水平的,我猜在原始框架中是垂直的。

我确实有两个有效的解决方法:

  • 使用旋转缓冲区Metal
  • 使用旋转缓冲区CoreImage(即使是“软件”也CIContext可以)

我还不能发布这些变通办法的原因是系统广播扩展的内存限制非常低,只有 50MB,而且这两种解决方案的内存使用量可能会激增,并且似乎与系统的其他部分(AVAssetWriter例如将帧转储到我的地址空间的守护进程)。我仍在努力了解这里的内存使用情况。

人工制品似乎是一个同步问题。但是我有一种感觉,这与其说是一个新的帧被写入我正在查看的缓冲区,不如说是某种陈旧的缓存。CPU还是GPU?GPU有缓存吗?人工制品的平铺性质让我想起了 iOS GPU,但那是一粒盐(不是硬件人)。

这让我想到了问题标题。如果这是一个缓存问题,并且Metal/CoreImage具有一致的像素视图,也许我可以让 Metal 刷新我想要的数据,因为被转换为 YUV 的 BGRA 屏幕捕获IOSurface已经Metal写满了着色器。

所以我拿了传入CMSampleBufferCVPixelBuffer'sIOSurface并从中创建了一个MTLTexture(有各种cacheModes 和storageModes,还没有尝试过hazardTrackingModes),然后用MTLTexture.getBytes(bytesPerRow:from:mipmapLevel:).

然而问题依然存在。出于内存原因,我真的很想让 CPU 深拷贝方法工作。

为了避免一些问题:

  • 这不是每行字节数的问题,这会使图像倾斜
  • 在 cpu 的情况下,我确实锁定了CVPixelBuffer的基地址
  • 我什至锁定了底层IOSurface
  • 我尝试丢弃IOSurface锁定种子在锁定下更改的 s
  • 我会在必要时丢弃帧
  • 我尝试过在各处放置随机内存围栏和互斥锁(不是硬件人员)
  • 我还没CoreImage

这个问题是Apple Developer Forums上发布的一个问题的延续

较小的瓷砖制品

https://twitter.com/artofzara的艺术作品

0 投票
1 回答
190 浏览

swift - 如何使用 XPC 正确地将 IOSurface 发送到另一个进程?

我正在开发一个 MacOS 应用程序,我试图将 IOSurface 从 XPC 服务发送到客户端应用程序(与 XPC 服务在同一个项目中),但我显然缺少一些东西。我收到以下错误:

Exception: Attempt to decode an xpc type but whitelist does not specify an XPC type '<no key>'.

整个错误文本如下:

我正在使用以下代码发送表面:

议定书:

在客户端进程上:

我不知道如何继续。我不清楚我究竟需要将什么列入白名单,或者如何去做。原则上,IOSurface 是 XPC 中支持的类型,所以我知道它应该可以工作。

0 投票
0 回答
283 浏览

ios - 渲染到 CVPixelBuffer 的 CIImage(在 CIContext 的帮助下)改变颜色

我从 IOSurface 创建一个 CIImage。然后我将它渲染到一个 CVPixelBuffer。如果我跳过 CIImage 步骤,颜色很好,但是我打算使用 CIImage/CIContext 函数裁剪图像。然而问题是 CIImage/CIContext 步骤引入了颜色变化。查看示例图像,左边是预期的颜色,右边是我最终得到的颜色。

在此处输入图像描述

我很确定(尽管不确定)它与色彩空间有关,而且 iPhone 使用 ..wide? .. 色彩空间?但是,我在 CIContext 和渲染步骤中尝试了无数种配置。例如:

但我从来没有得到任何不同的结果。我的完整代码是:

下面是来自 CIImage、CIContext、CVPixelBuffer 的 NSLog,以防万一。我有配置,我将 CIContext CGColorSpace 设置为与 CIImage 相同,输出没有任何变化。CIImage:

CI上下文

像素缓冲器

0 投票
0 回答
157 浏览

ios - iOS:什么是 IOFence,为什么它会冻结我们的应用程序?

我们有一个 AR 项目(内置于 Unity),它在博物馆的许多 iPad Pro(12.9,第 3 代)上运行 24/7。它已经存在了 2.5 年。我们总是偶尔出现冻结(在 iOS 13 及更低版本上),但最近它们变得更糟(在 iOS 14.4.2 和 14.6 上)。

问题表现如下,完全随机:我们的应用程序一直在后台运行(我们可以听到声音并看到数据库活动仍在继续),但它停止重绘,导致屏幕冻结在最后绘制的任何帧上。

我们在冻结时得到一个 gpuevent .ips 日志(见下文),其中包含有关 IOSurface 被 IOFence 阻止的信息。不过,关于这些日志的在线信息非常少,所以我们有点坚持分析。从我所能找到的一点点来看,似乎我们有一些资源,可能是纹理缓冲区,它被两个进程同时访问,导致其中一个进程(负责绘制屏幕的进程)被操作系统杀死。这听起来合理吗?如果是这样,我们如何找出问题在代码中的哪个位置被触发?

这里的任何人都可以比我们更好地解释此日志,还是有人对我们的下一步有建议?