AnyView 对 SwiftUI 性能的影响

💡 原文约3100字/词,阅读约需8分钟。
📝

内容提要

AnyView是一种类型擦除的视图,对于SwiftUI容器中的异构视图非常方便。然而,使用AnyView可能会导致功能损失。通过对比使用泛型和使用AnyView的修正完成,进行了一些测量。结果显示,在阅读数据时,使用AnyView会导致功能退化约10%至16.5%。因此,在异构视图的可滚动列表中,最好为容器中的不同视图使用具体类型,而不是使用AnyView。

🎯

关键要点

  • AnyView是一种类型擦除的视图,适用于SwiftUI容器中的异构视图。
  • 使用AnyView可能导致功能损失,SwiftUI难以确认视图的身份和结构。
  • Apple建议在ForEach中避免使用AnyView,以防止性能问题。
  • 测试在iPhone 11 Pro Max上进行,使用相同的数据集和用户,测量不同类型数据的滚动性能。
  • 动画卡顿是衡量性能的重要指标,卡顿时间越长,用户体验越差。
  • 在没有AnyView的情况下,平均FPS约为59帧,滚动流畅。
  • 使用AnyView时,平均FPS降至55帧,出现更多可见的卡顿。
  • 在更新视图时,使用AnyView导致FPS降至50以下,性能显著下降。
  • 使用AnyView时,功能退化约10%至16.5%。
  • 在异构视图的可滚动列表中,最好使用具体类型而非AnyView。
  • 在某些情况下,使用AnyView对性能影响不大,例如菜单视图。
  • 使用if-else语句与AnyView在某些测试中没有明显性能差异。