首页 新闻 赞助 找找看

WPF的UI在屏幕上移动占用CPU特别高的问题

0
[待解决问题]

问题描述:

在UserControl的OnRender事件中,调用drawingContext.DrawLine()方法,绘制背景。代码如下:

    protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext);

            Pen pen = new Pen();
            pen.Thickness = 1;
            pen.Brush = Brushes.Red;

            for (int i = 1; i < 100; i++)
            {
                drawingContext.DrawLine(pen, new Point(0, i * 30), new Point(this.ActualWidth, i * 30));
            }

得到效果如下(背景色设置成 Background="Transparent"):

然后在页面中添加入两个Path并且添加MouseMove事件

    <Grid>
        <Path x:Name="XFocusLine" Data="M0,1 L1,1" Stroke="Black" VerticalAlignment="Top" HorizontalAlignment="Left" StrokeThickness="1" Stretch="Fill" SnapsToDevicePixels="True" Panel.ZIndex="1000"/>
        <Path x:Name="YFocusLine" Data="M1,1 L1,1" Stroke="Black" VerticalAlignment="Top" HorizontalAlignment="Left" StrokeThickness="1" Stretch="Fill" SnapsToDevicePixels="True" Panel.ZIndex="1000"/>
    </Grid>


    protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);

            Point point = e.GetPosition(this);

            XFocusLine.Margin = new Thickness(0, point.Y, 0, 0);
            YFocusLine.Margin = new Thickness(point.X, 0, 0, 0);
        }

效果如下:

黑色的十字线跟随者鼠标的移动而移动,运行十分正常,cpu的使用率也不高。

问题来了,如果背景图案的实线改为虚线

  Pen pen = new Pen();
   pen.Thickness = 1;
   pen.Brush = Brushes.Red;
   pen.DashStyle = DashStyles.Dot;

当鼠标移动的时候,CPU的使用率变的特别高。两者之间唯一的差别就是一种情况是实线,一种情况是虚线( pen.DashStyle = DashStyles.Dot;)。

查了一些资料都没有得到答案,不知道哪问高手能够指点一下。

wpf
moohyuk的主页 moohyuk | 菜鸟二级 | 园豆:202
提问于:2012-04-19 10:40
< >
分享
所有回答(2)
0

启用GPU加速试一下?

terry.zh | 园豆:235 (菜鸟二级) | 2012-04-19 17:20
0

应该知道WPF的绘图功能是与硬件有关的,一般一次显示万个以上的绘制对象,就会出现延迟。

你的这个问题也是因上边的原因造成的。

虽然你绘制的线并不多,但是如果改成虚线显示,对于WPF来说,内部的实现也是每个可见点绘制成一个对象的。

所以,出现延迟是正常的。如果你把虚线的点改的长一点,延迟就会好一点。这也说明了上面的问题。

中文代码 | 园豆:951 (小虾三级) | 2012-04-28 08:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册