[英]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
加载图像。 当源是Uri
, BitmapDecoder
在一堆安全性和完整性检查中使用WpfWebRequestHelper
(未记录)来请求或“下载”图像。 如果生成的响应流是有效文件,它会直接将流加载到新的FileStream
。
之后,本机 Windows 图像解码功能将接管您的图像。 另请注意, BitmapDecoder
会被缓存,因此如果您连续加载多个图像,则不会有重新初始化新BitmapDecoder
的开销。 我不能说这是否与您的性能问题有关。
总之,我猜测 WPF 在内部用于加载图像的方法是一种高度优化的方法。 我还没有研究过HttpClient
的实现与可能使用简单的HttpWebRequest
来下载图像,但我怀疑您的方法的开销比内置方法的开销多,这也是导致您速度变慢的原因表现。
如果您想知道我是如何破译这些信息的,我只是使用名为Reflector的工具检查了PresentationCore
程序集中System.Windows.Media
命名空间中的几个类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.