【问题标题】:WPF - ScreenSaver graphics performance improvementsWPF - 屏幕保护程序图形性能改进
【发布时间】:2009-03-16 11:31:23
【问题描述】:

我拿了这个WPF-VS2008 ScreenSaver template 并开始制作一个新的屏幕保护程序。我对 winForms 平台 (GDI+) 屏幕保护程序有一些经验,所以我对 WPF 有点迷失。

  1. 我的屏幕保护程序的背景元素是 Canvas。
  2. DispatcherTimer 滴答设置为 33 毫秒,即 ~ 30 FPS。
  3. Background-color 只是一个巨大的 LinearGradientBrush。
  4. 在我的屏幕上(每个可用屏幕,在我的本地计算机上我有 2 个)用随机计算(初始化)背景颜色 + Alpha 通道绘制的 n 椭圆。它们都在 Canvas 的儿童系列中。
  5. 我正在使用一些逻辑在屏幕上移动这些省略号(每个 DispatcherTimer 滴答声)。我按椭圆移动,然后为每个椭圆调用 Canvas.SetLeft(...) 和 Canvas.SetTop(...)。
  6. 如果 N(椭圆数)大于 70-80,我开始注意到图形速度变慢。

现在,我想知道,在选择更高的 N 值时,我是否可以做些什么来提高图形的平滑度?我可以在移动椭圆之前“冻结”“某物”并在完成后“解冻”“某物”吗?或者我还有什么其他的办法吗?

并不是说我对提到的性能下降会过于挑剔 - 因为当 N==50 时,一切都会正常运行。即使椭圆都在同一个地方(大量透明的东西),也完全没有问题。

【问题讨论】:

    标签: c# wpf graphics


    【解决方案1】:

    您是否尝试过在 CompositionTarget.Rendering 事件中而不是在计时器中进行渲染?在使用渲染事件并进行我自己的双缓冲时,我在 3D 屏幕保护程序中获得了令人印象深刻的性能。 (见http://stuff.seans.com/2008/08/21/simple-water-animation-in-wpf/http://stuff.seans.com/2008/08/24/raindrop-animation-in-wpf/http://stuff.seans.com/2008/09/01/writing-a-screen-saver-in-wpf/

    【讨论】:

    • 谢谢您的信息。将阅读文章并尝试以“您的”方式进行操作:)。
    • Sean,我尝试了“CompositionTarget.Rendering”方法,但我没有看到任何性能提升。然后我发现了另一个提示/技巧。对于我正在使用的所有形状,将 IsHitTestVisible 设置为 FALSE(当然我不需要与屏幕保护程序进行用户交互)。这有点帮助!
    • 太好了,很高兴听到命中测试更改有所帮助!
    【解决方案2】:

    如果您对从 Freezable 继承的对象(例如画笔)调用 Freeze 方法,您将提高性能。

    原因是 Freezable 支持图形系统必须处理的额外更改通知,当您调用 Freeze 时,对象不能再更改,因此没有更多更改通知。

    对于这个通知系统的一个例子,如果你创建一个画笔,用它来画一个矩形(例如),然后改变画笔屏幕上的矩形会改变颜色。

    【讨论】:

      【解决方案3】:

      一旦某个对象被冻结,就无法解冻它(尽管对象的副本默认情况下是解冻的)。 WPF 中也默认启用双缓冲,因此您无法在此处获得。

      如果您不需要所有事件,那么如果您不需要使用形状,则可以使用 geometry objects(例如 Ellipse Geometry)而不是形状来提高性能(如果尚未这样做),因为它们的重量较轻。

      我还发现了这篇 MSDN 文章 Optimizing Performance: 2D Graphics and Imaging,它表明 CachingHint 可能会与其他一些技巧一起提供帮助。

      最后确保您使用的是最新的服务包一,因为它有许多性能改进outlined here

      【讨论】:

      • 实际上我所说的“椭圆”是什么意思——我的 Canvas 孩子是 EllipseGeometry 实例。我想 WPF 中没有更多的 GDI+ 类似技巧(当你可以玩一点样式-doubleBuffering 等时)?
      • 编辑:感谢 John&Nir 的 cmets。
      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      相关资源
      最近更新 更多