问题标签 [metal-performance-shaders]
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.
ios - 将 MPSCNNFullyConnected 迁移到 MPSCNNConvolutionDataSource
我正在从不推荐使用的迁移我的神经网络:
至
我已经实现了一个MPSCNNConvolutionDataSource
经过良好调试的并且适用于我的所有层,除了一个。仅出于测试目的,我在这里自己调用数据源函数以及不推荐使用的 init() ,MPSCNNFullyConnected
以确保正确实现数据源。我知道这不是它的预期用途,但我希望相同的数据进入两个 MPSCNNFullyConnected() 构造函数。以下代码运行,NN 正常工作。
当我用新的 init() 实例化全连接层时,网络会失败。以下代码运行但 NN 无法正常工作。
有什么建议为什么两个电话不相同?
objective-c - 在 Metal 中升级和模糊纹理的有效方法
我在 Metal (macOS) 中进行了一些渲染,价格相当昂贵,但如果结果稍微模糊,这是可以接受的。因此,为了优化事物,我以视图分辨率的一半渲染到纹理,然后放大结果并应用模糊滤镜 (MPS)。
为了放大纹理,我首先将其渲染到另一个纹理,然后应用模糊过滤器,将结果写入可绘制对象。我正在寻找一种技术来避免这种中间纹理(_texture2),以便模糊过滤器从原始纹理(_texture1)获取其输入。也许我应该编写自己的模糊着色器?
ios - MTKView 绘图性能
我想要做什么
我正在尝试使用金属视图在相机提要上显示过滤器:MTKView
。我正在密切关注 Apple 示例代码的方法 -通过利用 TrueDepth 相机数据增强实时视频(链接)。
到目前为止我所拥有的
以下代码效果很好(主要从上述示例代码中解释):
笔记
MTKViewDelegate
使用而不是子类化的原因是MTKView
当它被子类化时,在主线程上调用了绘图调用。使用上面显示的委托方法,似乎是一个不同的金属相关线程调用每个循环。上述方法似乎提供了更好的性能。CIFilter
必须编辑有关上述更新方法的使用细节。这一切都是一个沉重的链条CIFilters
堆叠。不幸的是,这些过滤器没有任何调整的余地。
问题
上面的代码似乎大大减慢了主线程的速度,导致应用程序 UI 的其余部分不稳定。例如,滚动 a UIScrollview
get 似乎很慢且不稳定。
目标
调整 Metal 视图以减轻 CPU 负担并轻松处理主线程,从而为 UI 的其余部分留下足够的汁液。
根据上图,命令缓冲区的准备工作都是在 CPU 中完成的,直到提交并提交(?)。有没有办法从 CPU 中卸载它?
任何提高绘图效率的提示、反馈、提示等将不胜感激。
macos - MPSImageIntegral 返回全零
我正在尝试使用MPSImageIntegral
来计算MTLTexture
. 这就是我正在做的事情:
但是,当我检查我的outtexture
值时,它全为零。难道我做错了什么?这是我将使用的正确方法MPSImageIntegral
吗?
我正在使用以下代码来读取写入的值outTexture
:
谢谢
ios - 如何在 CIImage 中找到最亮的点(可能在 Metal 中)?
我在 Metal 中创建了一个自定义 CIKernel。这很有用,因为它接近实时。我正在避免任何可能实时滞后的 cgcontext 或 cicontext。我的内核本质上是进行霍夫变换,但我似乎无法弄清楚如何从图像缓冲区中读取白点。
这是kernel.metal:
如果这部分可以提取到不同的内核或函数,我很好。CIKernel 的警告是,它的返回类型是一个代表像素新颜色的 float4。image -> image
理想情况下,我想要一种image -> array
交易,而不是过滤器。例如reduce而不是map。我有一种不好的预感,这将需要我在 CPU 上渲染并处理它。
最终,我想在我的 swift 函数中检索符合条件的坐标(每个图像可以有多个)。
最终解决方案编辑:
根据答案的建议,我正在 GPU 上进行大量的每像素计算,并在 CPU 上进行一些数学运算。我设计了 2 个额外的内核,它们的工作方式与内置缩减内核类似。一个内核返回每列中最大值的 1 像素高图像,另一个内核返回最大值的归一化 y 坐标的 1 像素高图像:
这不会给出亮度大于 0.8 的每个像素,但出于我的目的,它会返回足够的值:每列中的最大值及其位置。
Pro:仅将(2 * 图像宽度)字节复制到 CPU 而不是每个像素都可以节省大量时间(几毫秒)。
缺点:如果你在同一列中有两个主要的白点,你永远不会知道。如果适合您的用例,您可能必须更改它并按行而不是按列进行计算。
跟进:
渲染输出似乎有问题。金属中返回的浮点值与我快速获得的 UInt8 值无关。
这个未回答的问题描述了这个问题。
编辑: 这个回答的问题提供了一个非常方便的金属功能。当您在金属值(例如 0.5 )上调用它并返回它时,您将在 CPU 上获得正确的值(例如 128 )。
macos - 为 UInt32_t 运行 MPSImageIntegral
所以,我一直在尝试运行一些 MPS 内核。基于我之前的问题:MPSImageIntegral 返回全零
,我试图在浮点值上运行 MPSImageIntegral。现在,我转向uint32_t
价值观。但事实证明,我总是得到一个断言
/BuildRoot/Library/Caches/com.apple.xbs/Sources/MetalPerformanceShaders/MetalPerformanceShaders-121.4.2/MPSImage/Filters/MPSIntegral.mm:196:断言失败“目标0x600003b62760纹理格式与源0x600003b62680纹理格式不匹配”
该断言具有误导性,因为我的纹理类型不是不匹配的。
这就是我为创建我的MTLTexture
这是我用来创建输入和输出纹理的函数。然后我继续像这样运行我的 MPSImageIntegral:
基于此处的文档:https
MPSImageIntegral
://developer.apple.com/documentation/metalperformanceshaders/image_filters?language=objc支持MTLPixelFormatR32Uint
,我在这里做错了什么吗?
ios - 如果 `MPSCNNConvolutionDataSource` 协议的 `load` 方法返回 false 会发生什么?
如果MPSCNNConvolutionDataSource
协议的load
方法返回 false 会发生什么?系统会抛出错误还是卷积层会默默地失败?如果它静默失败,我怎么知道它失败了?
ios - Metal - 在传递给自定义内核过滤器之前调整视频缓冲区的大小
在我们的 iOS 应用程序中,我们使用使用 Metal 的自定义过滤器(CIKernel/CIColorKernel 包装器)。
假设我们有一个 4K 视频和一个输出大小为 1080p 的自定义视频合成,它在视频缓冲区上应用了高级过滤器。
显然,我们不需要过滤原始大小的视频,这样做我们可能会终止应用程序并发出内存警告(真实故事)。
这是视频过滤管道:
以 4K (asCIImage
)获取缓冲区-->
应用过滤器CIImage
-->
过滤器将CIKernel
Metal
过滤器功能应用到CIImage
-->
将过滤CIImage
后的组合返回
我能想到的唯一两个应用调整大小的地方是在我们将其发送到过滤器进程之前或在Metal
函数内。
我确定我不是第一个遇到这个问题的人
当传入的视频缓冲区太大(内存方面)无法过滤时该怎么办,并且他们需要有效地即时调整大小?之前没有重新编码视频?
c++ - Ios 应用程序在金属着色器代码中出现奇怪的错误
Ios 应用程序因金属着色器代码 C++ 中的一个奇怪错误而挂起
当我评论函数 getPixelOnTop --> 该应用程序运行良好:
但是,如果我用条件 false 绑定它,它就会挂起!!!