淘宝UWP--自定义图片缓存

一、应用场景

在淘宝应用首页,会有很多张图片,而这些首页图片不会经常改变,所以就需要缓存下来。这样就不必每次都从网络获取。

二、比较对象

1.系统缓存

对于系统缓存,我们不需要做什么处理。只需要把网络图片的URL赋值给Image控件就行了。这样系统就会在每次需要用到图片的时候,有限查找缓存里有没有之前下载好的。

2.自建缓存区域

自建缓存不给Image控件赋URL,而是把图片DownLoad下来,生成一个bitmap,然后把bitmap赋值给Image。同时将这个bitmap存储下来。当下次要用到这幅图的时候,就直接从存储的位置找到这幅图。

三、自建缓存方法

下边这段代码将uri[]数组中的图片下载下来,然后通过WriteToFile()函数将图片保存到本地,同时,记下存储的文件名。

SoftwareBitmap sb = await DownloadImage(uri[i]);

if (sb != null)

{

//sb = await ReadFromFile(fileName[i]);

SoftwareBitmapSource source = new SoftwareBitmapSource();

await source.SetBitmapAsync(sb);

this.insideImage.Source = source;

sb = await DownloadImage(uri[i]);

fileName[i] = await WriteToFile(sb);

//source.Dispose();

}

当你需要使用图片的时候,使用下列代码,通过ReadFromFile()函数将图片读取出来就行了。

for (int i = 0; i < 50; i++)

{

//SoftwareBitmap sb = await DownloadImage(uri[i]);

SoftwareBitmap sb = await ReadFromFile(fileName[i]);

SoftwareBitmapSource source = new SoftwareBitmapSource();

await source.SetBitmapAsync(sb);

this.insideImage.Source = source;

//source.Dispose();

}

四、效率对比

下边我通过对比两种缓存机制发现各有用武之地。

1.对于几百K到几兆的大图片,系统缓存有速度优势。

2.对于几K到几十K的小图片,自建缓存区有速度优势。

测试背景1:三张大图片,循环33次(共99次)

图片大小:338k 618k 1810k


PC测试

         

系统缓存(CPU周期)


3066584


3058505


3079367


3078989


3076976


自建缓存(CPU周期)


53669280


51842991


52839051


52078772


52305373


Phone测试

       

系统缓存(CPU周期)


31852799


32008575


32200748


31970601


31839003


自建缓存(CPU周期)


741909215


750950455


765863510


760865505


781048686

结论一:对于几百K到几兆的大图片,系统缓存有速度优势。

测试背景2:三张小图片,循环33次(共99次)

图片大小:3k 6k 60k

PC测试


系统缓存(CPU周期)


3057284


3057637


3080880


3063350


3059105


自建缓存(CPU周期)


1316247


1318369


1364584


1333684


1362956

Phone测试


系统缓存(CPU周期)


32085084


31751734


31744715


31852230


32064768


自建缓存(CPU周期)


27114317


26041012


26821794


27365796


30211258

结论二:对于几K到几十K的小图片,自建缓存区有速度优势。

手机淘宝项目测试数据:

测试背景:50张小图片,循环一次(共50次)


系统缓存


CPU周期


23689650


21589548


25409150


25186302


23121251

 
RAM


51


52


50


52


52

             
             

自建缓存


CPU周期


3186761


2892837


2963193


2942235


2741501

 
RAM


61


63


61


60


59

PS:RAM占用是峰值,稳定后两种方式RAM占用相同。

五、测试方法

通过给一个Image控件赋值,来看到效果。

1、系统缓存

系统缓存测试不能通过直接改变url的方式,因为系统缓存是异步的,他不会等一个图片加载好再加载另一个图,而是直接忽略了之前的改变。

private async void test1()

{

stopwatch.Reset();

stopwatch.Start();

BitmapImage bi = new BitmapImage();

bi.UriSource = new Uri(uri[0]);

this.insideImage.Source = bi;

}

private void insideImage_ImageOpened(object sender, RoutedEventArgs e)

{

times++;

if (times == 50)

{

stopwatch.Stop();

textBox.Text = "任务"+testnum.ToString()+"用时:" + stopwatch.ElapsedTicks + ".";

return;

}

BitmapImage bi = new BitmapImage();

bi.UriSource = new Uri(uri[times]);

this.insideImage.Source = bi;

}

2、自建缓存

private async void test2()

{

stopwatch.Reset();

stopwatch.Start();

for (int i = 0; i < 50; i++)

{

//SoftwareBitmap sb = await DownloadImage(uri[i]);

SoftwareBitmap sb = await ReadFromFile(fileName[i]);

SoftwareBitmapSource source = new SoftwareBitmapSource();

await source.SetBitmapAsync(sb);

if (i % 3 == 0)

{

this.insideImage.Source = source;

}

else if (i % 3 == 1)

{

this.insideImage1.Source = source;

}

else if (i % 3 == 2)

{

this.insideImage2.Source = source;

}

//source.Dispose();

}

stopwatch.Stop();

textBox.Text = "任务" + testnum.ToString() + "用时:" + stopwatch.ElapsedTicks + ".";

}

附:关键代码代码

ReadFromFile()函数通过文件名读取图片 ,特别注意这句话

SoftwareBitmapsoftwareBitmap = awaitdecoder.GetSoftwareBitmapAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);

一定要加上编码方式,不然会报错。

public async Task<SoftwareBitmap> ReadFromFile(string filename)

{

StorageFile file = await _localFolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);

//var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri( filename));

using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read))

{

// Create the decoder from the stream

BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);

// Get the SoftwareBitmap representation of the file

SoftwareBitmap softwareBitmap = await decoder.GetSoftwareBitmapAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);

return softwareBitmap;

}

}

WriteToFile()函数将bitmap写入存储区

public async Task<string> WriteToFile(SoftwareBitmap softwareBitmap)

{

string fileName = Path.GetRandomFileName();

if (softwareBitmap != null)

{

// save image file to cache

StorageFile file = await _localFolder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists);

using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))

{

BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);

encoder.SetSoftwareBitmap(softwareBitmap);

await encoder.FlushAsync();

}

}

return fileName;

}

DownloadImage()函数通过url下载图片,返回bitmap

private async Task<SoftwareBitmap> DownloadImage(string url)

{

try

{

HttpClient hc = new HttpClient();

HttpResponseMessage resp = await hc.GetAsync(new Uri(url));

resp.EnsureSuccessStatusCode();

IInputStream inputStream = await resp.Content.ReadAsInputStreamAsync();

IRandomAccessStream memStream = new InMemoryRandomAccessStream();

await RandomAccessStream.CopyAsync(inputStream, memStream);

BitmapDecoder decoder = await BitmapDecoder.CreateAsync(memStream);

SoftwareBitmap softBmp = await decoder.GetSoftwareBitmapAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);

return softBmp;

}

catch (Exception ex)

{

return null;

}

}

时间: 2024-10-22 05:28:59

淘宝UWP--自定义图片缓存的相关文章

飞流直下的精彩 -- 淘宝UWP中瀑布流列表的实现

在淘宝UWP中,搜索结果列表是用户了解宝贝的重要一环,其中的图片效果对吸引用户点击搜索结果,查看宝贝详情有比较大的影响.为此手机淘宝特意在搜索结果列表上采用了2种表现方式:一种就是普通的列表模式,而另一种则是突出宝贝图片的瀑布流模式. 如果用户搜索某些关键字,如女装类的情况下,淘宝的搜索结果会自动切换到瀑布流模式,让宝贝的美图更加冲击用户的视觉. 但是UWP默认的列表控件并没有这种效果,listview控件中虽然子元素可以不一样大小,但是只能有1列,gridview控件虽然有多列,但每个子元素都

PC版淘宝UWP揭秘

亲们,还记得一个月前我们的承诺吧?11.11,我们按时上线了手机淘宝UWP的Mobile版本(以下简称M版),感谢所有参与Windows Phone Insider Program的手机用户们,他们中有80%的热心用户下载了手机淘宝的Mobile版本,并给我们提供了大量有用的反馈,鼓励和鞭策我们不断改进产品质量. 我们的另一个承诺也即将兑现,那就是目标为12.12上线的淘宝UWP的Desktop版(以下简称D版)本.目前开发工作已经接近尾声,即将进行alpha内测,很快将会进行beta公测.希望

剁手党也有春天 -- 淘宝 UWP ”比较“功能诞生记

前言 网购已经不再是现在的时髦,而变成了我们每天的日常生活.上网已经和买买买紧密地联系在了一起,成为了我们的人生信条.而逛街一词,越来越多地变成了一种情怀.有时候我们去逛街,要么是为了打发时间,要么是想亲手摸摸商品本身,要么就是想看看不同的商品,放在眼前或者在脑海里比较一下.毕竟现在网上琳琅满目的商品让人眼花缭乱,一次展示一个,看完这个,忘了上一个:看完了最后一个,已经没有力气再打开长长的历史列表一个一个看回去.如果没有石猴的火眼金睛,如何万里挑一,找到自己中意的那个‘它’呢?毕竟我们大多数人,

淘宝UWP桌面版已经发布

目前正在等待应用商店的检测,很快会可以下载. 谢谢各位园主针对淘宝UWP 桌面版(又叫PC版,HD版等等)给予的feedback,在这里统一回复一下,就不一一感谢了. 有一件事需要说明一下,请看下图: 绿色方框的部分是H5页面,这里的内容完全有淘宝服务器端控制,所以由此产生的bug我们这边修不了,但是淘宝的攻城狮们已经知道了这些bug,正在努力修改. 如何区别哪些是H5页面呢?1)在右侧窄屏显示:2)标题条上的标题在中间:3)标题条右端有刷新和菜单(…)两个按钮.

从淘宝 UWP 的新功能 -- 比较页面来谈谈 UWP 的窗口多开功能

前言 之前在 剁手党也有春天 -- 淘宝 UWP ”比较“功能诞生记 这篇随笔中介绍了一下 UWP 淘宝的“比较”新功能呱呱坠地的过程.在鲜活的文字背后,其实都是程序员不眠不休的血泪史(有血有泪有史)……所以我们这次就要在看似好玩的 UWP 多窗口实现背后,挖掘一些我们也是首次接触的干活“新鲜热辣”地放松给大家.希望能使大家在想要将自己的 APP 开新窗口的时候,能从本文中得到一些启发,而不是总是发现 C# 关于 UWP 开新窗口可供参考的文章只有 Is it possible to open

淘宝店的图片哪里来的

有的是自己拍的,人后进行P图,有的是在别的店家盗用的.还有在百度上下载的自己更改一下,还有就是厂家提供的.转:http://zhidao.baidu.com/question/1882560047626784668.html 很多是自己拍摄实物上传的图片,也有卖家做模特拍摄而成,那种很光鲜的很多是代理商提供的图片,最好还是自己以实物拍摄,这样才是首要的诚信转:http://zhidao.baidu.com/question/125129750.html?qbl=relate_question_2

仿淘宝京东商品图片放大预览功能

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>图片放大镜效果</title> <style> *{ padding: 0; margin: 0; } body{ padding: 50px; position: relative; } .goods { width: 220px; height: 200px; position

淘宝搜索引擎的缓存机制入门总结

关于搜索的缓存机制的入门,有一篇很好的文章,在这里简单总结一下,下面是文章的链接:http://www.tao-sou.com/840.html 对于一个正常的搜索流程,比如用户输入查询请求“夏季 连衣裙”,淘宝搜索引擎需要分别将存储在磁盘上的两个单词的倒排索引读入内存,之后进行解压缩,然后求两个单词对应倒排列表的交集,找到所有包含两个单词的文档集合,根据排序算法来对每个文档的相关性进行打分,按照相关度输出相关度最高的搜索结果. 以上这个流程涉及了磁盘读/写.内存运算等一系列操作,相对比较耗费时

如何:使用PicturBox实现类似淘宝网站图片的局部放大功能

转载至http://xuzhihong1987.blog.163.com/blog/static/267315872011822113131823/ 概要: 本文将讲述如何使用PictureBox控件实现图片的局部放大浏览功能,效果类似淘宝网站的图片局部放大浏览,通过鼠标悬浮查看局部大图,同时扩展了鼠标滚轮放大缩小功能.本文将详细讲述实现该功能的主要思路,例子虽是在Winform的环境下实现(当时开发的系统用的是winform),但是代码实现思路在其他环境(如WPF)应该是通用的. 解决方案: