【问题标题】:How to fix "Optimization Opportunities"如何修复“优化机会”
【发布时间】:2021-01-24 08:37:30
【问题描述】:

我使用的是 xcode 12。 我编写了扩展 UI 视图如下:

@IBInspectable
public var shadowRadius: CGFloat {
    get {
        return layer.shadowRadius
    }
    set {
        layer.shadowRadius = newValue
    }
}

@IBInspectable
public var shadowOpacity: Float {
    get {
        return layer.shadowOpacity
    }
    set {
         layer.shadowOpacity = newValue
    }
}

@IBInspectable
public var shadowOffset: CGSize {
    get {
        layer.shadowOffset
    }
    set {
         layer.shadowOffset = newValue
    }
}

@IBInspectable
public var shadowColor: UIColor {
    get {
        return UIColor(cgColor: layer.shadowColor ?? UIColor.clear.cgColor)
    }
    
    set {
        layer.shadowColor = newValue.cgColor
    }
}

一切正常,但是当我调试视图时,我看到了一些像这样的紫色警告。

x-xcode-debug-views://7f8fd2258020?DBGViewDebuggerLaunchSessionParameter=7f8fd2258020: 运行时:优化机会:该层正在使用动态 渲染成本很高的阴影。如果可能尝试设置 shadowPath,或将阴影预渲染成图像并放入 层下。

有人可以向我解释一下并帮助我摆脱它吗?

【问题讨论】:

  • 谢谢你的问题,我也有同样的问题,但是我们怎么知道在哪一层工作呢?错误信息中没有任何提示
  • @StackGU 在运行应用程序时,打开调试视图层次结构。在左侧窗格中,您将在有问题的视图(及其父级)旁边看到一个紫色感叹号。

标签: swift xcode debugging uiview


【解决方案1】:

设置 shadowPath

一种解决方案是通过根据您的需要明确设置shadowPath 来“引导”阴影渲染,例如:

yourViewWithShadow.layer.shadowPath = UIBezierPath(rect: yourViewWithShadow.bounds).cgPath

确保您在正确的时间设置框架!

缓存光栅化

另一种解决方案是缓存光栅化:

yourViewWithShadow.layer.shouldRasterize = true
yourViewWithShadow.layer.rasterizationScale = UIScreen.main.scale

希望这可以帮助您消除昂贵的计算。

【讨论】:

  • 谢谢。我尝试设置 shadowPath 并且阴影不再出现。然后我尝试了缓存光栅化选项,当阴影再次显示时,优化机会警告也是如此。
  • 启用光栅化并不能解决此问题。
  • 光栅化将阻止 UIKit 在视图的框架发生变化时一次又一次地渲染阴影。但是第一次渲染,阴影还是动态渲染的,开销很大。简而言之,光栅化确实在某些用例中优化了性能,但视图仍有进一步优化的机会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 2022-10-04
  • 2011-05-14
  • 2010-11-15
  • 2020-09-02
  • 2021-09-26
相关资源
最近更新 更多