none
有关WPF的性能问题,请专家帮帮忙! RRS feed

  • 问题

  • 我模仿QQ的图片查看功能,用WPF做了一个类似的,主要功能点:

    1、通过translatetransform实现图片的移动(鼠标拖动)

    2、用scaletransform实现图片的缩放(鼠标滚轮)

    3、关闭窗口的时候,让窗口向上移动一段距离,同时窗口淡出(fadeout)

    但是发现实际使用的时候,性能非常糟糕(电脑配置:T450S笔记本电脑,CPU是i5,16GB内存),主要集中在:

    1、鼠标拖放图片的时候有明显的延迟,卡顿......

    2、关闭窗口的时候动画也是卡顿,好像放幻灯片....

    同一台电脑,用QQ的图片查看功能的时候,就非常流畅,没有任何卡顿......

    我上传了整个项目文件,恳请微软的专家帮我分析一下是否有改进的空间?

    下载地址:

    https://share.weiyun.com/bb733197ee8c8316314eb9110a1d8405


    da jia hao!

    2017年12月5日 10:00

全部回复

  • 这是程序的运行效果图:



    da jia hao!

    2017年12月5日 11:25
  • Hi,

    >>1、鼠标拖放图片的时候有明显的延迟,卡顿......

    首先, 建议不要拖拽Image控件,因为你在Grid每次拖拽,都会导致Grid的重新布局计算。建议把Image放在一个ScrollViewer里。

    >>2、关闭窗口的时候动画也是卡顿,好像放幻灯片....

    较少动画的使用...

    另外,不要直接对Image控件做缩放,旋转等操作,比如你可以直接对BitmapImage进行旋转。

            bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.UriSource = new Uri(selectedFileName);
            bitmap.Rotation = (Rotation)Enum.Parse(typeof(Rotation),
            RotationList.SelectionBoxItemStringFormat);  
            bitmap.EndInit();
            Image1.Source = bitmap;

    更多的请参考:How to: Apply a Transform to a BitmapImage

    Sincerely,

    Bob



    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年12月6日 9:35
    版主
  • 请问你有实际运行我那个程序吗?

    我之前学习HTML、CSS3的时候知道,用TranslateTransform对对象实现平移变换,是不会导致DOM重新计算布局的,只有当直接修改对象的left、top属性的时候才会导致布局重新计算。

    我认为WPF也一样,所以用了TranslateTransform来对图片进行平移变换,它应该不会引起grid的重新布局计算啊?

    另外,关闭窗口的时候我做了一个动画效果,虽然你建议说少用动画,但实际用户就是喜欢这些花哨的功能,如果我们不做,用户就不满意。。。能否帮我看看这部分代码写得是否规范,怎么样才能够让窗口关闭的时候有一个流畅的动画效果?


    da jia hao!

    2017年12月8日 7:08
  • 你好,

    事实上,你的程序在我的机器上运行的很好。

    >> 我认为WPF也一样,所以用了TranslateTransform来对图片进行平移变换,它应该不会引起grid的重新布局计算啊?

    你的对的,我注意到你用的是RenderTransform, 这种变换是不会导致Grid重新布局。

    >> 能否帮我看看这部分代码写得是否规范,怎么样才能够让窗口关闭的时候有一个流畅的动画效果?

    在关闭动画时,你似乎在设置改变Element的Opacity,建议通过设置Brush.Opacity来设置。

    你可以通过Timeline.DesiredFrameRate来适当的降低默认的动画帧数。

    另外,建议你参考这个ZoomBorder代码:https://stackoverflow.com/questions/741956/pan-zoom-image

    Sincerely,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年12月8日 10:38
    版主
  • 谢谢,我先看看。

    da jia hao!

    2017年12月11日 6:33
  • 我做了一个简单的图片测试,代码:

                im = new BitmapImage(new Uri(@"d:\photo\228.jpg", UriKind.RelativeOrAbsolute));
                DateTime d = DateTime.Now;
                TransformedBitmap imx = new TransformedBitmap();
                imx.BeginInit();
                imx.Source = im;
                imx.Transform = new ScaleTransform(2, 2);
                imx.EndInit();
                img1.Source = imx;//img1是Image控件
                Console.WriteLine((DateTime.Now - d).TotalMilliseconds.ToString());

    我就是将图片放大两倍,Console里面显示这个操作只要0-1毫秒,可是我实际观察在界面上,有明显的延迟和卡顿(至少一秒钟)。

    请问这是为什么?是Image控件的问题吗?有没有一个不用Image控件也可以显示图片的方法?

    测试用的图片下载地址:

    http://url.cn/5Om3c5O



    da jia hao!

    2017年12月12日 3:09