簡體   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