使用 Metal 的旧设备上的内存使用量持续上升

2024-01-08

I use Metal and CADisplayLink活过滤CIImage并将其渲染成MTKView.

// Starting display link 
displayLink = CADisplayLink(target: self, selector: #selector(applyAnimatedFilter))
displayLink.preferredFramesPerSecond = 30
displayLink.add(to: .current, forMode: .default)

@objc func applyAnimatedFilter() {
    ...
    metalView.image = filter.applyFilter(image: ciImage)
}

根据 Xcode 中的内存监视器,iPhone X 上的内存使用量很稳定,永远不会超过 100mb,在 iPhone 6 或 iPhone 6s 等设备上,内存使用量不断增长,直到最终系统杀死应用程序。

我已经使用检查内存泄漏Instruments,但没有泄漏的报道。通过分配运行应用程序也不会显示任何问题,并且应用程序不会被系统关闭。我还发现有趣的是,在较新的设备上,内存使用量是稳定的,但在较旧的设备上,它只会不断增长。

过滤器的复杂性并不重要,因为我尝试了最简单的过滤器,但问题仍然存在。这是我的金属文件中的一个示例:

extern "C" { namespace coreimage {

    float4 applyColorFilter(sample_t s, float red, float green, float blue) {

        float4 newPixel = s.rgba;
        newPixel[0] = newPixel[0] + red;
        newPixel[1] = newPixel[1] + green;
        newPixel[2] = newPixel[2] + blue;

        return newPixel;
    }
}

我想知道是什么导致了旧设备上的问题以及我应该朝哪个方向寻找。

更新1:这是两张 1 分钟的图表,一张来自Xcode和一个来自Allocations两者都使用相同的过滤器。Allocations图是稳定的,同时Xcode图总是在增长:

更新2:附上按大小排序的分配列表的屏幕截图,该应用程序运行了 16 分钟,不停地应用过滤器:

更新3:有关正在发生的事情的更多信息applyAnimatedFilter():

我将过滤后的图像渲染为metalView这是一个MTKView。我收到来自的过滤后的图像filter.applyFilter(image: ciImage),其中Filter接下来上课:

 func applyFilter(image: ciImage) -> CIImage {
    ...
    var colorMix = ColorMix()
    return colorMix.use(image: ciImage, time: filterTime)
 }

where filterTime只是一个 Double 变量。最后,这是整个 ColorMix 类:

import UIKit

class ColorMix: CIFilter {

    private let kernel: CIKernel

    @objc dynamic var inputImage: CIImage?
    @objc dynamic var inputTime: CGFloat = 0

    override init() {

        let url = Bundle.main.url(forResource: "default", withExtension: "metallib")!
        let data = try! Data(contentsOf: url)
        kernel = try! CIKernel(functionName: "colorMix", fromMetalLibraryData: data)
        super.init()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func outputImage() -> CIImage? {

        guard let inputImage = inputImage else {return nil}

        return kernel.apply(extent: inputImage.extent, roiCallback: {
            (index, rect) in
            return rect.insetBy(dx: -1, dy: -1)
        }, arguments: [inputImage, CIVector(x: inputImage.extent.width, y: inputImage.extent.height), inputTime])
    }

    func use(image: CIImage, time: Double) -> CIImage {

        var resultImage = image

        // 1. Apply filter
        let filter = ColorMix()
        filter.setValue(resultImage, forKey: "inputImage")
        filter.setValue(NSNumber(floatLiteral: time), forKey: "inputTime")

        resultImage = filter.outputImage()!

        return resultImage
    }

}

这是 Xcode 诊断功能(Metal 验证和/或 GPU 帧捕获)中的一个错误。如果关闭这些功能,内存使用情况应该与在 Xcode 外部运行时类似。

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

使用 Metal 的旧设备上的内存使用量持续上升 的相关文章

  • 在 iOS 中发送音频文件和 JSON 字符串

    我正在尝试将音频文件和 JSON 字符串发送到 PHP 服务器 使用以下代码将发送 JSON 但文件到达时为空 如果我将 JSON 块放在音频块下方 文件将完全到达 但 JSON 为空 有什么想法吗 void sendFile NSStri
  • 在phonegap中播放本地声音

    我有一个 wav文件在我的www文件夹 我正在使用 jQuery 和以下代码 警报响起 但声音不播放 难道我做错了什么
  • ios如何搜索目录

    我想知道如何检查我的应用程序中是否存在目录 例如 如果我想搜索我的应用程序文档中是否存在文件夹 以及如何在其中创建新文件夹 此致 检查文件是否存在 BOOL fileExistsAtAbsolutePath NSString filenam
  • 如何在气隙 Mac 上安装新的 Apple 全球开发者关系中级证书?

    您可能知道也可能不知道 现在使用新的中间证书生成新的签名证书 你可以在这里读到它 https developer apple com support wwdr intermediate certificate https developer
  • 使用 Swift 访问 Twitter

    我正在使用 Swifter 库在我的 Swift iOS 8 应用程序中访问 Twitter https github com mattdonnelly Swifter https github com mattdonnelly Swift
  • UICollectionViewCell 拖动预览的自定义视图

    我正在尝试实现一项功能 用户可以将一个集合视图单元格拖放到另一个集合视图单元格上 但是 我想完全更改运动中物体的预览 以匹配我的应用程序的视觉隐喻 该项目没有移动 该项目包含的东西正在移动 例如 假设我的collectionview单元格显
  • 每次打开应用程序时,FileManager 的路径 URL 都不同[重复]

    这个问题在这里已经有答案了 我想在fileManager根路径中创建一个文件夹 但在创建之前 我想检查该文件夹是否存在 如果不存在 我将创建 否则将保留它 这是我使用的功能 public func isDirectoryExist path
  • 核心数据executeFetchRequest消耗大量内存

    我正在核心数据数据库中插入 cca 100 000 条记录 数据库包含 3 个实体 球员 俱乐部 球员俱乐部 实体之间存在关系 玩家 gt 玩家俱乐部俱乐部 在 PlayerClub 中插入时 我注意到插入大约 50 000 条记录后会消耗
  • Objective c RSA 与 OAEP 填充 sha256 之前的 ios 10

    我正在研究一种在iPhone中使用RSA加密方法的加密方法 到目前为止我可以用这种方法实现获取加密字符串 该字符串被服务器成功解密 SecKeyRef keyRef self addPublicKey pubKey SecKeyAlgori
  • 将时间舍入到最接近的三十秒

    我有一个应用程序 它显示每 30 秒过期的数据 准确地说 在 h m s 11 30 00 11 30 30 11 31 00 等 我可以获得当前时间 但我不确定如何计算现在到最近的三十秒之间的时间 我发现的所有内容都是 Objective
  • iOS UITableView:使用 CAGradientLayer 将背景颜色指定为渐变

    我刚刚开始使用 Xcode 4 3 中的主从视图模板 我试图更改主视图的背景颜色并将其设置为颜色渐变 这是我尝试过的 Colors m import Colors h implementation Colors UIColor naviga
  • iOS 中第一响应者的正式定义是什么?

    据我所知 第一响应者对象是根据输入活动等接收回调信号 并且它将沿着链向上冒泡 直到找到愿意处理它的响应者 但更正式地说 第一响应者的范围是什么 例如 它是应用程序范围的响应程序吗 似乎作为第一响应者只是说这个特定的对象将收到交互通知 其他响
  • -[_SwiftValueencodeWithCoder:]:无法识别的选择器发送到实例

    尝试使用 NSCoder 时出现错误 玩家 swift class Player NSObject NSCoding private var playerName String private var playerScore Int pri
  • 辅助功能标识符在 iOS 模拟器的辅助功能检查器中不可见

    我想使用辅助功能检查器来验证在模拟器 iOS 9 2 中运行的应用程序中的所有辅助功能标识符 辅助功能检查器能够返回多个辅助功能字段 但不能返回标识符 知道为什么以及如何我能看到它们吗 实际上有一种方法 克里斯 普林斯 Chris Prin
  • 当键盘出现时调整 UITextView 的大小

    我想在键盘出现时调整文本视图的大小 我的代码如下 我打开了自动布局 因此使用来自超级视图的 textView gt bottom 空间的约束 并通过 IBOutlet distanceFromBottom 引用它 void keyboard
  • iOS 上的推送通知渐进式 Web 应用程序

    我需要开发一个集成了推送通知的渐进式网络应用程序 在网上搜索我发现了关于这个主题的不同意见 如果我理解正确的话 目前我们无法在移动版 safari 中推送通知 但仅限桌面版 这样对吗 你有什么建议来获得相同的结果吗 我不是iOS专家 我想知
  • Objective-C 中 NSURL 为 null 而 NSString 是正确的

    我有一个NSString包含一个 url 以及当我分配时NSURL与NSString NSURL 输出 空 这是因为url中有一些非法字符 导致NSURL不编码就无法读取NSString包含网址 NSString u incomingUrl
  • 如何从 App Store Connect 中删除自动创建的 macOS 应用程序

    I have an iOS app Recently macOS app automatically appeared in App Store Connect 我不打算在 macOS 上发布 iOS 应用程序 我怎样才能摆脱它 我打开了
  • Xcode 中的 Prefix.pch 文件是什么?

    许多开发人员正在向其中添加各种方便的宏Prefix pch 但我的问题是那是什么Prefix pch file 如果我删除它Prefix pch来自我的文件Xcode 那么我的应用程序会运行吗 或者会显示什么错误吗 或者它会在构建过程中崩溃
  • 初始化Object中的空字符串?

    有人使用以下方法来初始化 NSstring NSString astring NSString alloc init 我想知道为什么不直接使用 NSString atring nil or NSString astring 没有semant

随机推荐

  • 如何在 Mac OS X Mavericks 上链接 std C++ 库?

    我正在将应用程序移植到 OS X Darwin 但遇到缺少符号的链接错误 例如 std 1 basic string
  • 像 iTunes 11 一样绘制 NSTableView 交替行

    我知道还有其他关于更改交替行颜色的问题 这很容易 但这不是我想做的 我想在基于视图的 NSTableView 中绘制自定义的交替颜色行 这些行看起来像 iTunes 11 中的行 行的顶部和底部有轻微的边框 如此屏幕截图所示 NOTE 我知
  • 在海报博客上,“液体错误:私有方法‘gsub’调用 nil:NilClass” 是什么意思?

    我在博客右侧遇到了此消息的问题 你能帮我一下吗 我刚刚也遇到了这个错误 您运行的液体过滤器的值可能为零 我的 jekyll 网站上有这样的内容 在我的根页面上 未设置标题 您可以通过确保设置该值来修复它 或者您可以使用类似这样的方法来强制将
  • 在 System.Windows.Form 派生类中的何处处置资源?

    我有一个表单 它在其构造函数中创建了一些我需要处理的一次性资源 但是 C 表单设计器已在 Designer cs 文件中生成 Dispose 方法 该方法中似乎没有任何类型的用户挂钩 所以我不知道应该如何实现典型的IDisposable图案
  • 获取丰富编辑库的版本

    ALL 是否可以获得程序使用的 RichEdit 控件的版本 Version Class name Library Shipped with New features 1 0 RICHEDIT Riched32 dll Windows 95
  • 鲁比:析构函数?

    我偶尔需要在缓存目录中使用 rmagick 创建图像 为了快速删除它们 而又不会在视图中丢失它们 我想在图像类的 Ruby 实例被破坏或进入垃圾收集时删除图像文件 我必须重写什么 ClassMethod 才能为析构函数提供代码 edgeru
  • 根据pandas数据框中的关键列减去列

    我有两个数据框看起来像 df1 ID A B C D 0 ID1 0 5 2 1 3 5 6 6 1 ID2 1 2 5 5 4 3 2 2 2 ID1 0 7 1 2 5 6 6 0 3 ID3 1 1 7 2 10 3 2 df2 ID
  • 获取 JSON 数组中的最大值

    我正在尝试创建一个 JavaScript 函数 该函数从外部 JSON 中的数组获取信息 然后获取其中一个 JSON 变量的最大值 或前 5 个值 对于此示例 假设我想要获取值 ppg 的最大值 这是该数组的一个小样本 player And
  • 我可以将 Activex 与 silverlight4 一起使用吗?

    我需要在我的 silverlight 应用程序中使用 ActiveX 控件 经过一些研究 我发现了 silverlight 应用程序可以使用 ActiveX 控件的几种方法 在网页中使用 ActiveX 控件以及 silverlight 插
  • 使用 ScheduledExecutorService 启动和停止计时器

    从我的阅读来看 ScheduledExecutorService 似乎是在 Java 中启动和停止计时器的正确方法 我需要移植一些启动和停止计时器的代码 这不是一个周期性定时器 此代码在启动计时器之前停止计时器 因此 实际上每次启动都是一次
  • 如何使用swift在iOS嵌入式动态框架中使用第三方库

    现在我有一个项目 比如 testApp 使用一些第三方库 比如 alamofire 和 Objective C 中的其他一些库 现在我想添加一个今天的小部件 根据一些教程 我创建了一个新的目标 testAppKit 作为共享动态框架 并将目
  • Java:System.out.println() 这么慢的原因是什么?

    对于可以在文本编辑器中完成的小型逻辑程序 为了跟踪 我使用经典的System out println 我想你们都知道在大量迭代的块中使用它是多么令人沮丧 为什么这么慢 其背后的原因是什么 这与 JVM 没有任何关系 将文本打印到屏幕上只涉及
  • FileProvider - 使用默认内部存储文件夹,文件路径不明确

    它在文档中说 FileProvider 只能为以下位置的文件生成内容 URI 您事先指定的目录 要指定目录 使用 XML 的子元素指定其存储区域和路径 元素 例如 以下 paths 元素告诉 您打算请求图像 的内容 URI 的 FilePr
  • 如何在AngularJS中获取图像尺寸?

    我想在用户选择要上传的文件时检查图像的尺寸
  • 反转角度 2 *ngFor

    li user name is user age years old li 是否可以反转 ngFor 使项目自下而上添加 你可以简单地使用 JavaScript reverse 在阵列上 不需要特定角度的解决方案 li user name
  • 首先在 EF 代码中将文字或常量作为复合键的一部分

    我对实体框架的代码优先方法相对较新 我已经使用数据库优先方法有一段时间了 但是代码优先似乎更适合我当前正在开发的应用程序 我正在使用现有的 MS SQL 数据库 并且不允许我对数据库进行任何更改 我使用 Code First 的原因是 Fl
  • 在 Windows 8 中使用 C# 的 WinRT 中的磁盘空间

    我有两个解决方案 但都对我没有用 解决方案1 kernel32 dll 其工作代码 注意 但我不想在我的应用程序中导入任何 dll b c 其市场提交问题 DllImport kernel32 dll SetLastError true s
  • django 本地时间模板过滤器不起作用

    我使用 django 1 10 来显示日期时间 日期时间存储在 mongodb 中 并且始终是没有时区信息的 UTC 因此我需要根据运行 django 的机器的时区显示日期时间 首先 在settings py中添加它们 TIME ZONE
  • 编译错误:“版本高于引用的程序集”

    我的视图页面出现错误 因此我将 Visual Studio 更新为 mvc4 尽管我正在使用 mvc3 我第一次使用 NuGet 更新 但它不起作用 所以我通过独立 MVC4 更新 所以它起作用了 但是当我尝试运行 MVC3 项目时 出现以
  • 使用 Metal 的旧设备上的内存使用量持续上升

    I use Metal and CADisplayLink活过滤CIImage并将其渲染成MTKView Starting display link displayLink CADisplayLink target self selecto