图片缓存:ImageCache和ImageSdCache(一)

 对于客户端——服务器端应用,从远程获取图片算是经常要用的一个功能,而图片资源往往会消耗比较大的流量,对应用来说,如果处理不好这个问题,那会让用户很崩溃,不知不觉手机流量就用完了,等用户发现是你的应用消耗掉了他手机流量的话,那么可想而知你的应用将面临什么样的命运。

对于图片资源来说,你不可能让应用每次获取的时候都重新到远程去下载,这样会浪费资源,但是你又不能让所有图片资源都放到内存中去(虽然这样加载会比较快),因为图片资源往往会占用很大的内存空间,容易导致OOM。那么如果下载下来的图片保存到SDCard中,下次直接从SDCard上去获取呢?这也是一种做法,我看了下,还是有不少应用采用这种方式的。采用LRU等一些算法可以保证sdcard被占用的空间只有一小部分,这样既保证了图片的加载、节省了流量、又使SDCard的空间只占用了一小部分。另外一种做法是资源直接保存在内存中,然后设置过期时间和LRU规则。

sdcard保存:

在sdcard上开辟一定的空间,需要先判断sdcard上剩余空间是否足够,如果足够的话就可以开辟一些空间,比如10M

Android 之图片本地缓存解决方案 - zhou_411424 - 惜世缺麟的博客
当需要获取图片时,就先从sdcard上的目录中去找,如果找到的话,使用该图片,并更新图片最后被使用的时间。如果找不到,通过URL去download
去服务器端下载图片,如果下载成功了,放入到sdcard上,并使用,如果失败了,应该有重试机制。比如3次。
下载成功后保存到sdcard上,需要先判断10M空间是否已经用完,如果没有用完就保存,如果空间不足就根据LRU规则删除一些最近没有被用户的资源。

内存保存:

在内存中保存的话,只能保存一定的量,而不能一直往里面放,需要设置数据的过期时间、LRU等算法。这里有一个方法是把常用的数据放到一个缓存中(A),不常用的放到另外一个缓存中(B)。当要获取数据时先从A中去获取,如果A中不存在那么再去B中获取。B中的数据主要是A中LRU出来的数据,这里的内存回收主要针对B内存,从而保持A中的数据可以有效的被命中。

Android 之图片本地缓存解决方案 - zhou_411424 - 惜世缺麟的博客

在这次手机应用开发中,我是将sdcard保存和内存保存两种方法结合使用:在得到图片的URL后,首先在内存中查找,没有找到,再到sd卡中查找,若还是没有找到,则开始异步下载,下载完成后,将图片同时缓存到内存与sd卡中,便于下一次快速的获取它。

采用两者结合方式,优势很明显:能在内存没有释放前,快速获取到图片,减少对sd卡的存取;sd卡缓存,又能弥补内存资源不足和长期保存的确点。

          
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Verilog是一种硬件描述语言,用于设计和描述数字电路。图片缓存通常是在图形处理单元(GPU)中使用的一种技术,用于临时存储图像数据以提高图像处理效率。在Verilog中实现图片缓存涉及到处理图像数据的存储、读取和处理等方面。 在Verilog中,可以使用多种方式来实现图片缓存。一种常见的方式是使用双端口的RAM(Random Access Memory)来存储图像数据。其中一个端口用于写入图像数据,另一个端口用于读取图像数据。这样可以实现并行地读取和写入图像数据,提高数据访问的效率。 以下是一个简单示例,演示如何使用Verilog实现一个基本的图片缓存: ```verilog module ImageCache ( input wire [7:0] image_data, input wire write_enable, input wire read_enable, input wire [7:0] read_address, output wire [7:0] read_data ); reg [7:0] cache [0:255]; always @(posedge clk) begin if (write_enable) begin cache[read_address] <= image_data; end end always @(posedge clk) begin if (read_enable) begin read_data <= cache[read_address]; end end endmodule ``` 上述代码定义了一个名为ImageCache的模块,其中包含一个8位宽的图像数据输入端口(image_data)、一个写使能端口(write_enable)、一个读使能端口(read_enable)、一个8位宽的读地址端口(read_address)和一个8位宽的读数据输出端口(read_data)。 在模块内部,使用了一个由256个8位宽寄存器(cache)组成的数组来实现图片缓存。在上升沿时钟触发的always块中,根据写使能信号,将图像数据写入到指定的缓存地址中;在下降沿时钟触发的always块中,根据读使能信号和读地址,从指定的缓存地址读取图像数据并输出到读数据端口。 需要注意的是,上述示例只是一个简单的图片缓存实现,实际应用中可能需要考虑更多的功能和细节,例如数据读写的时序、地址映射算法、缓存策略等。具体的实现方式和细节可以根据具体需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值