【问题标题】:WPF Bitmap performanceWPF 位图性能
【发布时间】:2012-03-05 03:53:25
【问题描述】:

我试图了解为什么我的图像不活泼,因此我构建了一个示例来测试 WPF 性能。我使用计时器来计算我的“显示图像”事件处理程序执行了多长时间,并使用秒表来测量图像出现在屏幕上所用的时间。底线:当显示 100、1600、2500 和 3600 图像时,WPF 花了 2、9、12 和 16 秒 我的代码完成在屏幕上显示图像。所以我感到很无奈:看来我无法改进我的代码来让图像显示得更快——我需要用 WPF 做点什么!

所以我的问题是:我需要做些什么不同的事情来使图像显示得更快?


测试设置很简单:

窗口包含一个网格。单击“测试”按钮后,添加行和列定义。然后在网格的每个单元格中添加一个图像,如下所示:

            var image = new Image();
            image.BeginInit();
            image.Name = ImageNameFromCell(theRow, theColumn);
            image.Stretch = Stretch.None;
            image.HorizontalAlignment = HorizontalAlignment.Center;
            image.VerticalAlignment = VerticalAlignment.Center;
            RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.LowQuality);
            image.EndInit();

            theGrid.Children.Add(image);

最后,将每个图像的 Source 设置为位图:已按比例缩小到估计屏幕尺寸的灰度图像。位图生成如下:

            var smallerBitmapImage = new BitmapImage();
            smallerBitmapImage.BeginInit();
            smallerBitmapImage.DecodePixelWidth = (int)(theImageWidth);
            smallerBitmapImage.UriSource = theUri;
            smallerBitmapImage.CacheOption = BitmapCacheOption.None;
            smallerBitmapImage.EndInit();

            //BitmapFrame bitmapFrame = BitmapFrame.Create(this.FullPath);

            var convertedBitmap = new FormatConvertedBitmap();
            convertedBitmap.BeginInit();
            convertedBitmap.Source = smallerBitmapImage;
            convertedBitmap.DestinationFormat = PixelFormats.Gray16;
            convertedBitmap.EndInit();
            convertedBitmap.Freeze();

所以,我束手无策。图像出现明显延迟,似乎超出了我的控制。我能做什么?

【问题讨论】:

    标签: wpf performance bitmap


    【解决方案1】:

    您真的会同时看到所有这些图像吗?如果没有,您可以使用一些带有虚拟化面板的ItemsControl,以便只显示视图中的图像。 (说到面板,您当前的设置也可以替换为ItemsControl,它使用UniformGrid 作为panel

    您也可以尝试编写更好的解码器,这可能是白费力气。

    【讨论】:

    • 感谢您的回答,H.B.是的,我确实希望同时看到所有这些图像。 1600、2500 和 3600 案例用于测试,所以我可以用手表的秒针轻松测量 WPF 的延迟,但我会说 400 个图像是我想要支持的数字。关于“更好的解码器”的建议,我认为解码已经在上面的“smallerBitmapImage”代码中完成,即在我的代码中,而不是在 WPF 在我的事件处理程序返回后执行它所做的任何事情期间,这是我的时间试图缩短...
    • @Avi:哦,对了,因为文件大概是本地的,解码可能会同步发生,但我不确定内部情况;鉴于转换不会引发异常,该假设似乎是可行的。如果这归结为纯渲染时间,您可能真的会陷入困境,因为您似乎已经做了所有可以加快从解码到更小尺寸到防止缩放的事情的事情。不知道你还能在这里做什么:(
    【解决方案2】:

    似乎有所不同的是将图像的缓存选项设置为 OnLoad

    smallerBitmapImage.CacheOption = BitmapCacheOption.OnLoad;

    这将工作转移到我的事件处理程序,所以现在我可以使用预取在后台执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      相关资源
      最近更新 更多