【问题标题】:Performance degrades after navigating to some pages导航到某些页面后性能下降
【发布时间】:2016-03-04 09:08:24
【问题描述】:

我的 WinRT 应用程序(仅限 Windows Phone)遇到了这个奇怪的问题。该应用程序由多个页面组成,它使用动画来显示模仿 W10M 中的汉堡菜单的侧面菜单。应用程序首次启动时动画和应用程序性能非常好,但在导航到某些页面(例如 3 或 4 个页面)后,应用程序性能变得越来越差。我没有任何代码在 UI 线程或任何其他线程的后台运行。

我缺少关于 WinRT 中导航的内容吗?这真的很奇怪,我不知道是什么原因造成的。

【问题讨论】:

  • 您是否尝试查看诊断工具 CPU 配置文件?
  • 删除所有动画(可能一个一个)。可能会有一个动画狂奔或两个动画互相争斗。通过更改可见性来显示/隐藏菜单,而不是精确定位“邪恶”动画(如果这是问题)你在 Load/Loaded/Navigated 和类似的事件处理程序中有任何代码吗?
  • @FilipSkakun 在手机上调试应用程序时,我的诊断工具无法正常工作,因为当应用程序关闭后 VS 开始构建报告时出现空异常,但在模拟器中,它们只能工作美好的。但是在模拟器上使用它们就不好了,因为计算机的 CPU 速度更快,而且模拟器中不会出现性能问题。
  • 好吧,如果你泄露了一些东西 - 你很可能会在手机和 PC 上泄露,所以内存诊断可能会有所帮助。
  • @FilipSkakun 我在模拟器上全新安装应用程序时运行了内存分析,最大内存使用量为 60MB(每次加载所有页面两次后)我还说 GC 启动并声明内存将其降至 45-50MB 左右。所以我认为我的应用程序没有泄漏问题。

标签: c# xaml windows-runtime winrt-xaml


【解决方案1】:

以下是影响 XAML 性能的一些注意事项。

  1. 视觉树的深度。您可以拖动两个控件,但这些控件代表多个嵌套控件 - 诸如边框、按钮和面板之类的东西。如果控件比您想要的更复杂,运行您的应用并使用 Live XAML 树查看器查看它可以为您提供提示。此外,在构建 UI 时请牢记深度。喜欢简单的控件,如 RelativePanel 和标准的非重新模板控件。

  2. 构造与加载逻辑。尚不熟悉 XAML 的开发人员在不适当的地方实现复杂逻辑的情况并不少见。例如,您可能在子类控件的构造函数中告诉它去获取一些数据或测试一些昂贵的条件。理想情况下,如果您有这种类型的逻辑,您将使用控件的 Loaded 或页面的 OnNavigatedTo,如果您有选择,请使用 async

  3. 数据绑定。数据绑定很棒,但也很昂贵。您可以在页面上的几十个地方使用它,这不太可能有所作为,但如果您开始在任何地方使用它,并且对所有事物都使用它,它可能会非常昂贵。最简单的补救措施是减少页面中的绑定。接下来,您可以将绑定从Mode=OneWay(默认)更改为Mode=OneTime。接下来,您可以尽可能从 {binding} 切换到 {x:bind}。请记住,绑定并没有错,只是成本高,所以只在适当的时候使用。

  4. 记录太多。如果你有一个像 ListView 或 GridView 这样的中继器,那么你可能一次出现了太多的项目。这是一件大事,尤其是在负载时。获取数据的真正成本很少见,通常是渲染数据。如果您的项目数据模板很复杂,那么您的可视化树深度可能会与每条记录相乘数倍。加载时加载较少的记录,然后随着时间的推移显示更多记录是一种方法。使用 x:Phase 是另一种很好的方法。简化您的项目模板是另一种方法。最小化项目模板中的数据绑定会有所帮助。但是,您能做的最好的事情就是运行诊断工具并查看是什么原因造成的。它可能根本不是您的 ListView。

  5. 未使用的视觉状态。开发人员很聪明地使用视觉状态。但是,他们定义的某些状态是针对边缘情况的,并且仅在某些情况下显示。这些视图的 XAML 可能永远不会出现,因此它们将其可见性标记为折叠。这没关系。但是,如果您更进一步并使用 x:DeferLoadingStrategy,您可以避免在启动时进行 XAML 解析和呈现的成本。当视觉状态显示 XAML 时,平台会自动实现。你是赢家,用户也是。

因此,5 个有用的提示可帮助您的网页加载更快。

很可能,你的理由会是别的:)

还有一件事

您是否允许从内存中删除您的页面?是否有可能在您的代码隐藏中的隐式代码中订阅静态或全局事件?也许您需要取消订阅 OnNavigatedFrom 覆盖。由于问题会随着时间的推移而变得更糟,因此听起来可能是内存问题。不过,这只是一个猜测。这是一个常见的 C# 错误。

祝你好运

【讨论】:

  • 您好杰瑞,感谢您的回复。您提供的 XAML 提示很棒,但我在设计页面时已经完成了所有这些。你提到的关于静态事件的事情很有趣,但我没有任何页面/视图模型监听静态事件,所以这不是发生的事情。我想知道在页面 XAML 中声明的 ViewModel 会发生什么?他们会被页面破坏吗?还是他们会留下来?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2016-03-31
  • 2017-03-22
  • 1970-01-01
  • 2014-06-18
  • 2021-10-16
相关资源
最近更新 更多