- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
写入IOSurface
时需要使用哪些API,以及需要采取哪些预防措施在 XPC 进程中,该进程也被用作 MTLTexture
的后备存储。在主应用程序中?
在我的 XPC 服务中,我有以下内容:
IOSurface *surface = ...;
CIRenderDestination *renderDestination = [... initWithIOSurface:surface];
// Send the IOSurface to the client using an NSXPCConnection.
// In the service, periodically write to the IOSurface.
在我的应用程序中,我有以下内容:
IOSurface *surface = // ... fetch IOSurface from NSXPConnection.
id<MTLTexture> texture = [device newTextureWithDescriptor:... iosurface:surface];
// The texture is used in a fragment shader (Read-only)
我有一个MTKView
正在运行正常的更新循环。我希望我的 XPC 服务能够定期写入 IOSurface
使用 Core Image,然后在应用程序端由 Metal 渲染新内容。
需要什么同步才能确保正确完成?双倍或三倍缓冲策略是其中之一,但这对我来说实际上不起作用,因为我可能没有足够的内存来分配 2 倍或 3 倍数量的表面。 (为了清晰起见,上面的示例使用一个表面,但实际上我可能有几十个要绘制的表面。每个表面代表图像的一个图 block 。图像可以是 JPG/TIFF/等允许的大小.)
WWDC 2010-442 讨论 IOSurface
并简要提到这一切都“正常工作”,但这是在 OpenGL 的上下文中,没有提到 Core Image 或 Metal。
我最初假设 Core Image 和/或 Metal 会调用 IOSurfaceLock()
和IOSurfaceUnlock()
以保护读/写访问,但情况似乎并非如此。 (头文件中 IOSurfaceRef.h
的注释表明锁定仅适用于 CPU 访问。)
我真的可以让Core Image的CIRenderDestination
随意写信至IOSurface
当我读到相应的MTLTexture
时在我的应用程序的更新循环中?如果是这样,那么正如 WWDC 视频所述,所有纹理都绑定(bind)到 IOSurface
,这怎么可能?共享相同的视频内存?如果在同一次读取和写入过程中发生,我肯定会撕裂表面的内容。
最佳答案
您需要做的是确保CoreImage绘制在IOSurface
之前在XPC中完成。用于在应用程序中绘图。如果您在两侧都使用 OpenGL 或 Metal,则可以调用 glFlush()
或[-MTLRenderCommandEncoder waitUntilScheduled]
。我假设 CoreImage 中的某些内容正在进行其中一个调用。
我可以说,如果没有发生这种情况,情况可能会很明显,因为如果没有正确同步,您会看到撕裂或图像一半是新渲染,一半是旧渲染。我在使用 IOSurface
时看到过这种情况发生跨 XPC。
您可以做的一件事是在 -waitUntilScheduled
上放置一些符号断点和-waitUntilCompleted
并查看 CI 是否在您的 XPC 中调用它们(假设 documentation 没有明确告诉您)。 Metal 中还有其他同步原语,但我对它们不是很熟悉。它们也可能有用。 (据我所知,CI 现在在幕后都是 Metal 。)
此外,IOSurface
对象有方法 -incrementUseCount
, -decrementUseCount
,和-localUseCount
。可能值得检查这些内容,看看 CI 设置是否正确。 (有关详细信息,请参阅 <IOSurface/IOSurfaceObjC.h>
。)
关于macos - 如何跨进程同步 MTLTexture 和 IOSurface?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54504584/
我正在使用 Metal 来显示相机框架。我将输出的样本缓冲区转换为 id使用 CVMetalTextureCacheCreateTextureFromImage ,效果很好……除了框架顺时针旋转了 9
我关注了this example 从 Apple 缩小非常大的图像我是 downloading from a remote location .我已经用 Swift 重写了代码。它显然有效,但是当我调
我可以创建一个新的 MTLTexture 尺寸 w2/h2 现有 MTLTexture 区域 x1/y1/w1/h1 ? PS:我考虑过使用 MTLTexture.buffer?.makeTextur
我正在尝试获取 MTLTexture 的像素这边走: let pixelCount = compareTexture.width * compareTexture.height let region
我有一个 MTLTexture,它是它出现在 MTLView 中的大小。但是,我正在将纹理写入 AVAssetWriterInputPixelBufferAdaptor 以录制需要纹理的视频标准视频尺
MTLTexture 之间的主要区别是什么?对比 CGImageRef ?我们什么时候需要使用MTLTexture而不是 CGImageRef (反之亦然)? 我有一个应用程序(比如视频游戏),它可以
我使用以下代码创建了一个 MTLTexture 对象(为清楚起见,仅列出了部分代码)。 int tmpbuf[4096] id device = MTLCreateSystemDefaultDevic
我试图通过计算每个像素的所有 R G B 和 A 分量的总和来确定 MTLTexture(bgra8Unorm 格式)是否为空白。 此函数旨在通过在将纹理复制到指针后在内存中添加相邻的 float 来
我知道如何创建 MTLBuffer 和/或 MTLTexture,但是当不再需要这些资源时如何释放 GPU 内存? 最佳答案 MTLBuffer 和 MTLTexture 是 Objective-C
写入IOSurface时需要使用哪些API,以及需要采取哪些预防措施在 XPC 进程中,该进程也被用作 MTLTexture 的后备存储。在主应用程序中? 在我的 XPC 服务中,我有以下内容: IO
我有这个方法 - (id) createTextureFromImage:(UIImage*) image device:(id) device { CGImageRef imageRef = i
我将计算着色器的结果存储在 MTLBuffer 中。 MTLBuffer 的每个元素都是一个 UInt16。我试图将结果传递给片段着色器,该着色器通过将 MTLBuffer 的元素解释为 0 到 25
我是 Metal 新手。我想从 CVImageBufferRef 制作 MTLTexture。我正在使用以下代码示例来执行此操作。 guard let unwrappedImageTe
我有一个之前从 png 文件创建的 UIImage: let strokeUIImage = UIImage(data: pngData) 我想将 strokeImage(具有不透明度)转换为 MTL
MTLTexture 是一种内存分配,用于存储 GPU 可访问的格式化图像数据。我想知道有没有什么方法可以在本地保存 MTLTexture 数据? 如果是这样,在本地保存 MTLTexture 数据的
我目前正在使用 Metal 开发实时过滤器。在定义我的 CIImage 之后,我将图像渲染到 MTLTexture。 下面是我的渲染代码。 context 是由 Metal 支持的 CIContext
生成由 CVPixelBuffer 支持的 MTLTexture 的正确方法是什么? 我有以下代码,但它似乎泄漏了: func PixelBufferToMTLTexture(pixelBuffer:
我有内核函数,它必须将从 pixelBuffer(ARFrame.capturedImage) 创建的 Y 和 CbCr 纹理转换为 RGB 纹理,就像在苹果指南中一样 https://develop
尝试在 SCNRender 对象的每次调用渲染上从 MTLTexture 创建 CVPixelBufferRef: CVPixelBufferLockBaseAddress(pixelBuffer
我有一个(动画)UIView-Hierarchy,我想定期将 UIView 内容渲染到 MTLTexture 中以供进一步处理。 我尝试过的是子类化我的父 UIView 和 override publ
我是一名优秀的程序员,十分优秀!