【问题标题】:Rendering on MetalView freezes iPhone 8在 MetalView 上渲染会冻结 iPhone 8
【发布时间】:2021-08-18 18:48:21
【问题描述】:

当我在 MetalView 上渲染图像时,iPhone 8 冻结。

如果我选择 12Mpx 图像,iPhone 8 会在一段时间后冻结。如果我选择 18Mpx(或更大)的图像,手机会立即死机,甚至硬件按钮也会有一段时间没有响应。 在其他 iPhone 上,它很少重现。

应用程序继续工作,触摸事件到来,代码被执行,但 UI 被冻结。

我做了一个简单的项目,没有额外的代码,它很容易重现。它也不依赖于 UIScrollView(项目有一个没有它的分支)和调试模式。我在 iPhone 8(iOS 14.2、4.5)上对其进行了测试。在 iPhone 7+、12、12pro 上,它不会被复制。

https://github.com/Sanych6666/CoreImageMetalExample

【问题讨论】:

    标签: ios iphone freeze metal metalkit


    【解决方案1】:
    1. 请修正加载图片的代码:
    UIImage(named: "exampleImage.png")
    

    UIImage(named: "exampleImage")
    

    iOS 更好地使用此方法的图像名称。

    1. 您的设备不支持这么大的金属纹理。 所以金属上下文不能处理这个。 CIContext 可以,但是 Metal 低级库,所以你应该手动解决这个问题。

    我建议在发送到 CIImage 之前减少图像分辨率。

    【讨论】:

    • 根据developer.apple.com/metal/Metal-Feature-Set-Tables.pdf A11 CPU最高支持16384 * 16384纹理。而且这种冻结不会在较弱的设备(iPhone 7 Plus)上重现。
    • 我需要渲染全分辨率图像。降低分辨率不是正确的解决方案。
    • @AlexandrMaruk,是的,你是对的,我一点点调试代码,发现:Image too big, and this operation: try self.context?.startTask(toRender: image, to: destination) Finished之后:commandBuffer.present(drawable)
    • 我开发了照片编辑应用程序,我必须处理大图像。 startTask 返回一个异步的CIRenderTask,它将被执行。这种方法比context.render(_ image:...) 工作得更快,内存使用更少
    猜你喜欢
    • 1970-01-01
    • 2017-12-09
    • 2010-10-28
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2017-04-17
    相关资源
    最近更新 更多