[英]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.