WPF - ScreenSaver图形性能改进

时间:2009-03-16 11:31:23

标签: c# wpf graphics

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

  1. 我的屏幕保护程序的背景元素是Canvas。
  2. DispatcherTimer tick设置为33毫秒,约为30 FPS。
  3. 背景颜色只是一个巨大的LinearGradientBrush。
  4. 在屏幕上我有(每个可用的屏幕,在我的本地计算机上我有2个)n-Ellipses用随机计算的(初始化)背景颜色+ Alpha通道绘制。他们都在Canvas的儿童系列中。
  5. 我正在使用一些逻辑(每个DispatcherTimer勾选)将这些省略号移动到屏幕上。我对每个椭圆进行移动,然后为每个椭圆调用Canvas.SetLeft(...)和Canvas.SetTop(...)。
  6. 如果N(椭圆的数量)更高> 70-80,我开始注意到图形减速。
  7. 现在,我想知道,在选择更高的N值时,我是否可以采取任何措施来改善图形平滑度?我可以在移动我的椭圆之前“冻结”“某些东西”,并在我完成时“冻结”“某些东西”吗?或者我还能做其他任何技巧吗?

    并不是说我对提到的性能下降过于挑剔 - 因为当N == 50时,一切都应该顺利进行。即使Ellipses在同一个地方都是ALL(加载透明度的东西),也没有任何问题。

3 个答案:

答案 0 :(得分:4)

您是否尝试过在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/

答案 1 :(得分:0)

冻结之后无法解冻(尽管默认情况下对象的副本是未解除的)。默认情况下,WPF中也启用了双缓冲,因此您无法在此处获得。

如果尚未完成提高性能的方法是使用geometry objects(例如Ellipse Geometry而不是形状,如果您不需要所有事件,因为它们的重量较轻。

我也发现这篇MSDN文章Optimizing Performance: 2D Graphics and Imaging表明CachingHint可能会提供其他一些提示。

最后确保您使用的是最新的Service Pack,因为它有许多性能改进outlined here

答案 2 :(得分:0)

如果在从Freezable继承的对象上调用Freeze方法,那么您将提高性能 - 例如,画笔。

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

对于此通知系统的示例,如果您创建画笔,使用它来绘制矩形(例如),然后更改画笔,屏幕上的矩形将更改颜色。