Unity+NGUI打造网络图片异步加载与本地缓存工具类(一)

我们在移动端的开发中,异步网络图片加载用的非常的多,在unity当中虽然有AssetBundle的存在,一般是先加载好游戏资源然后再进入场景,但是还有不少地方能够用到异步网络图片的加载以及其缓存机制。

我之前也写过两个版本的ios中的异步网络图片加载helper类,所以今天按照同样的思路,也想做一个好用的helper类给大家使用以及简单的说下实现原理。

首先我们加载一张网络图片,要做的事情分步来讲为:

0.开始之前设置一张固定的图片作为占位图(placeholder),表示我们的图片还没加载好,来填充当前图片控件区域,让用户知道

1.这个图片有个url地址,我们的程序第一次加载这个url地址的图片时

a.异步开始下载这张图片

b.保存到某个指定的目录

c.将图片控件上占位图替换为下载好的图片,可以适当的添加图片切换动画(动画本文略)

2.我们的程序已经加载过这个url地址的图片

a.从上次存进的目录中读取文件,转换为图片

b.将图片控件上占位图替换为下载好的图片

总的来说我们的程序应该是在第一次加载一批网络图片的时候,是需要哪张下哪张,然后显示出来,而后,是可以直接从文件系统中去读取的(第三种情况,从内存中直接读取,取决于设备配置,这里就不做了)

开始做这个工具类之前,先要知道一些unity的特殊限制:

1.MonoBehaviour基类的成员方法 StartCoroutine开启异步任务是不支持静态方法中调用的

2.MonoBehaviour基类的子类不能直接使用关键字new 来创建,相应的,需要创建一个空的GameObject,然后调用这个object的AddComponent方法来实例化,也就是说unity中的脚本对象都依附于游戏对象才能被执行

3.由于unity的跨平台特性,每个不同的平台的文件目录结构有区别

基于上述一些特殊性,我打算把这个工具类作成一个MonoBehaviour的子类,并以单例的形式让其他脚本调用,其中的异步网络请求就可以使用StartCoroutine函数了

首先是这个单例的实现方法:

using UnityEngine;
using System.Collections;
using System.IO;

public class AsyncImageDownload :MonoBehaviour {

	public  Texture placeholder;
	public static AsyncImageDownload  Instance=null;

	private   string path=Application.persistentDataPath+"/ImageCache/" ;

	//构建单例
	public static AsyncImageDownload CreateSingleton()
	{
		if (!Directory.Exists(Application.persistentDataPath+"/ImageCache/")) {
			Directory.CreateDirectory(Application.persistentDataPath+"/ImageCache/");
		}

		GameObject obj = new GameObject ();
		obj.AddComponent<AsyncImageDownload> ();

		AsyncImageDownload loader= obj.GetComponent<AsyncImageDownload>();
		Instance=loader;
		loader.placeholder=Resources.Load("placeholder") as Texture;
		return loader;

	}

这里没有使用构造函数来创建单例,原因是MonoBehaviour的子类压根不支持new关键字,所以怎么去写构造函数呢

然后这个构建单例的方法是跟构造方法差不多的,只是不是去new出来,而是类名.方法名()来创建这个单例,在创建单例的时候需要创建一个空白游戏体来依附我们的脚本组件,并且把静态成员Instance指向创建出来的这个单例,多次使用这个单例的时候只需要使用 类名.Instance()来获取已经存在的这个脚本组件单例。

这里的Resources.Load(“placeholder”)需要注意,用代码读取项目目录中的图片资源并转换成Texutre对象,需要再Project窗口下的Assets中创建Resources文件夹,然后导入任何一张图片进去,代码中获取他不需要加后缀名。

这个脚本写好以后,我们的程序初始化的时候应该执行以下代码来创建这个单例:

AsyncImageDownload.CreateSingleton()

而后,给某个控件加载网络图片,我们应该给这个单例加一个方法public  void SetAsyncImage(string url,UITexture texture),那么简化的写法就可以写为:

AsyncImageDownload.Instance.SetAsyncImage ("http://www.cfanz.cn/uploads/jpg/2013/07/13/0/XEPLd7d2C5.jpg", page.GetComponentInChildren<UITexture> ());

这个方法会在这篇博文的第二部分中完成

时间: 2024-10-13 12:37:01

Unity+NGUI打造网络图片异步加载与本地缓存工具类(一)的相关文章

Unity+NGUI打造网络图片异步加载与本地缓存工具类(二)

接上文,我们的工具类中的主要方法: public  void SetAsyncImage(string url,UITexture texture) 按照前文分析的图片加载步骤来 public void SetAsyncImage(string url,UITexture texture){ //开始下载图片前,将UITexture的主图片设置为占位图 texture.mainTexture = placeholder; //判断是否是第一次加载这张图片 if (!File.Exists (pa

[原创]cocos2dx加载网络图片&amp;异步加载图片

[动机] 之前看到一款卡牌游戏,当你要看全屏高清卡牌的时候,游戏会单独从网络上下载,本地只存了非高清的,这样可以省点包大小,所以我萌生了实现一个读取网络图片的类. [联想] 之前浏览网页的时候经常看到一张图片渐进(由模糊变清晰)的显示,如果在游戏中,诸如像显示高清卡牌的时候,使用有这种方式去显示一张图片,这样的体验应该会稍微好些 [相关知识] png interlaced:png图片在导出的时候是可以选择 interlaced (Adam7)的,这样的存储的png在网页上显示会渐进显示, 这种i

Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)

加载图片属于比较耗时的工作,我们需要异步进行加载,异步加载有两种方式:1.通过AsyncTask类进行:2.通过Handler来实现,下面我们就来看一下如何通过这两种方式实现网络图片的异步加载. 一.AsyncTask方式 1.main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.co

android异步加载图片并缓存到本地实现方法

图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓存策略.今天首先介绍一下本地缓存图片 在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出.针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载上面缓存到本地,以后如果本地有就直接从本地加载.图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如

基于 unity ngui 上的滚动加载__UiVirtual

在游戏里面经常会有背包,好友,对话,这样的列表.当列表的内容多了,如果一打开界面就对所有内容进行实例化,会消耗大量的性能,且会造成UI上的卡顿. 于是便需要,在列表里面只实例化屏幕上可见的item.屏幕外的不需要进行实例化. 这里 https://github.com/textcube/infinitescroll 便是我们要找的内容 如图: 然而在在看源码的时候我们不难发现,这个开源的git仓库,是对移动到屏幕外面的item进行了destroy(见WordItem.cs),对移动到屏幕上的it

iOS之加载等待指示器(工具类)

#import "CXDView.h" @interface CXDView () //动态图 @property (strong, nonatomic) UIImageView *loadingImageView; //提示文字 @property (strong, nonatomic) UILabel *toastLabel; @end @implementation CXDView #pragma mark - 初始化 - (instancetype)init { self =

windows phone 8.0 的网络图片异步加载方案

买了一本林政的8.1UI的书,看到一个使用弱引用对像来解决图片缓存的问题,刚好自已写的应用也遇到这个问题,于是小改动了一下代码,搬到了8.0版本来使用,代码由 zhxilin℃+ 大神提供了部分解决代码. 下面提供一个下载链接,提供给有需要的朋友下载. http://files.cnblogs.com/files/dreamIT/%E5%9B%BE%E7%89%87%E5%BC%82%E6%AD%A5%E5%8A%A0%E8%BD%BD.rar

浅谈Android中的异步加载之ListView中图片的缓存及优化三

     隔了很久没写博客,现在必须快速脉动回来.今天我还是接着上一个多线程中的异步加载系列中的最后一个使用异步加载实现ListView中的图片缓存及其优化.具体来说这次是一个综合Demo.但是个人觉得里面还算有点价值的就是里面的图片的缓存的实现.因为老实说它确实能在实际的项目中得到很好的应用.主要学习来源于慕课网中的异步加载学习,来自徐宜生大神的灵感.本次也就是对大神所讲知识的一个总结及一些个人的感受吧. 这次是一个综合的Demo,主要里面涉及到的知识主要有:网络编程.异步加载.JSON解析.

SDWebImage图片二级缓存异步加载基本原理

关于SDWebImage SDWebImage是一个针对图片加载的插件库,提供了一个支持缓存的用于异步加载图片的下载工具,特别的为常用的UI元素:UIImageView,UIButton和MKAnnotationView提供了Category类别扩展,可以作为一个很方便的工具.其中SDWebImagePrefetcher可以预先下载图片,方便后续使用. SDWebImage的Github地址为:https://github.com/rs/SDWebImage SDWebImage的几点特性 为U