繁体   English   中英

为什么将 XAML 图像源设置为 URI 比使用 HttpClient 获取图像更快?

[英]Why is setting a XAML Image Source to URI faster than using HttpClient to get the Image?

我正在构建一个 Windows 应用商店应用程序并同时学习 XAML。 我想在 GridView 中显示的 http URI 上有远程图像。

我的原始解决方案涉及使用HttpClient从 URI 下载图像字节数组,获取RandomAccessStreamReference ,构造BitmapImage ,然后将 XAML Image控件的 source 属性设置为构造的BitmapImage 然而,这个解决方案被证明是相当慢的(1-2 整秒才能获得单个图像)。

我的下一个解决方案是将原始 URI 直接绑定到 XAML Image控件的源属性,XAML 引擎似乎自行解决。 过去需要 10 秒才能加载大约 8-10 张图像突然变成了即时。

有谁知道 XAML Image控件的默认 URI 转换器究竟是如何解析远程图像数据的? 我的第一个解决方案完全有可能只是实施得很差,但差异大到足以激起我的好奇心。

假设我从ImageSourceConverter类中找到了正确的一段代码,当您将源指定为字符串时,转换器会尝试执行以下操作:

    if (((value is string) && !string.IsNullOrEmpty((string) value)) || (value is Uri))
    {
        UriHolder uriFromUriContext = TypeConverterHelper.GetUriFromUriContext(context, value);
        return BitmapFrame.CreateFromUriOrStream(uriFromUriContext.BaseUri, uriFromUriContext.OriginalUri, null, BitmapCreateOptions.None, BitmapCacheOption.Default, null);
    }

BitmapFrame依次使用BitmapDecoder加载图像。 当源是UriBitmapDecoder在一堆安全性和完整性检查中使用WpfWebRequestHelper (未记录)来请求或“下载”图像。 如果生成的响应流是有效文件,它会直接将流加载到新的FileStream

之后,本机 Windows 图像解码功能将接管您的图像。 另请注意, BitmapDecoder会被缓存,因此如果您连续加载多个图像,则不会有重新初始化新BitmapDecoder的开销。 我不能说这是否与您的性能问题有关。

总之,我猜测 WPF 在内部用于加载图像的方法是一种高度优化的方法。 我还没有研究过HttpClient的实现与可能使用简单的HttpWebRequest来下载图像,但我怀疑您的方法的开销比内置方法的开销多,这也是导致您速度变慢的原因表现。

如果您想知道我是如何破译这些信息的,我只是使用名为Reflector的工具检查了PresentationCore程序集中System.Windows.Media命名空间中的几个类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM