[原]unity3d之http多线程异步资源下载
郑重声明:转载请注明出处 U_探索
本文诞生于乐元素面试过程,被面试官问到AssetBundle多线程异步下载时,愣了半天,同样也被深深的鄙视一回(做了3年多u3d 这个都没用过),所以发誓要实现出来填补一下自己的空白,同时分享给大家。说明:本人只在pc和Android下测试好使,其他平台未知!
直接贴代码,都是C# http的API,不懂得自己百科。
using UnityEngine;
using System.Collections;
using System;
using System.Text;
using System.Net;
using System.IO; internal class WebReqState
{
public byte[] Buffer; public FileStream fs; public const int BufferSize = ; public Stream OrginalStream; public HttpWebResponse WebResponse; public WebReqState(string path)
{
Buffer = new byte[];
fs = new FileStream(path,FileMode.Create);
} } public class HttpHelper { string path = null;
string assetName;
public HttpHelper(string path)
{
this.path = path;
} public void AsyDownLoad(string url)
{
Debug.Log(url);
assetName = url.Split('/')[];
Debug.Log(assetName);
HttpWebRequest httpRequest = WebRequest.Create(url) as HttpWebRequest;
httpRequest.BeginGetResponse( new AsyncCallback(ResponseCallback), httpRequest);
} void ResponseCallback(IAsyncResult ar)
{
HttpWebRequest req = ar.AsyncState as HttpWebRequest;
if(req == null) return;
HttpWebResponse response = req.EndGetResponse(ar) as HttpWebResponse;
if(response.StatusCode != HttpStatusCode.OK)
{
response.Close();
return;
}
Debug.Log(path+ "/"+assetName);
WebReqState st = new WebReqState(path+ "/"+assetName);
st.WebResponse = response;
Stream responseStream = response.GetResponseStream();
st.OrginalStream = responseStream;
responseStream.BeginRead(st.Buffer,,WebReqState.BufferSize,new AsyncCallback(ReadDataCallback),st);
} void ReadDataCallback(IAsyncResult ar)
{
WebReqState rs = ar.AsyncState as WebReqState;
int read =rs.OrginalStream.EndRead(ar);
if(read>)
{
rs.fs.Write(rs.Buffer,,read);
rs.fs.Flush();
rs.OrginalStream.BeginRead(rs.Buffer, , WebReqState.BufferSize, new AsyncCallback(ReadDataCallback), rs);
}
else
{
rs.fs.Close();
rs.OrginalStream.Close();
rs.WebResponse.Close();
Debug.Log(assetName+":::: success");
}
}
}
下载部分:
if(GUI.Button(new Rect(,,,),"test"))
{
string rootPath = Application.persistentDataPath;//android上保存到 /storage/sdcard0/Android/data/包名(例如:com.example.test)/files
for(int i =;i<str.Length;i++) //str是string型数组,存放部分assetbundle名字
{
Thread thread = new Thread(new ParameterizedThreadStart(DownAsset)); //ParameterizedThreadStart 多线程传参
thread.Start(rootPath+"|"+str[i]); //只能带一个object参数 所以使用字符串拼接
}
} void DownAsset(System.Object file)
{
string[] fileName = file.ToString().Split('|');
HttpHelper help = new HttpHelper(fileName[]);
help.AsyDownLoad("http://192.168.0.103/unity/"+fileName[]+".AssetBundle");//注意在手机上测试 该对Ip地址
}
下载完成后 可以去/storage/sdcard0/Android/data/包名(例如:com.example.test)/files查找对应文件
加载部分:
if(GUI.Button(new Rect(,,,),"load"))
{
for(int i =;i<str.Length;i++)
{
StartCoroutine(LoadAsset(str[i],i));
}
}
IEnumerator LoadAsset(string name,int i)
{
WWW w = new WWW("file://"+Application.persistentDataPath+"/"+name+".AssetBundle");
yield return w;
Instantiate(w.assetBundle.mainAsset,new Vector3(i*,,),Quaternion.identity);
w.assetBundle.Unload(false);
}
注意事项:
1、pc测试 需要修改IP地址,本地测试改为127.0.0.1 同时Application.persistentDataPath最好做修改,因为在pc上Application.persistentDataPath:C:\Users\用户名\AppData\LocalLow\DefaultCompany\u3d工程名,可以下载到此文件夹下,但是加载的时候会报错,没什么权限之类的
2、android上需要stripping level设置为Disabled
[原]unity3d之http多线程异步资源下载的更多相关文章
- Cocos2d-x 3.0多线程异步资源载入
Cocos2d-x从2.x版本号到上周刚刚才公布的Cocos2d-x 3.0 Final版,其引擎驱动核心依然是一个单线程的"死循环".一旦某一帧遇到了"大活儿" ...
- Cocos2d-x 3.0多线程异步资源载入代码
// AppDelegate.cpp bool AppDelegate::applicationDidFinishLaunching() { - - FlashScene* scene = Flash ...
- unity3d中asset store 的资源下载到本地的目录位置
来源:http://blog.csdn.net/fzhlee/article/details/8613688 C:/Users/[当前用户]/AppData/Roaming/Unity/Asset S ...
- 【iOS系列】-多图片多线程异步下载
多图片多线程异步下载 开发中非常常用的就是就是图片下载,我们常用的就是SDWebImage,但是作为开发人员,不仅要能会用,还要知道其原理.本文就会介绍多图下载的实现. 本文中的示例Demno地址,下 ...
- C# 实现的多线程异步Socket数据包接收器框架
转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...
- 可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui)
可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui) 0 前言 >>[前言].[第1节].[第2节].[第3节]. ...
- Android 学习笔记之使用多线程实现断点下载...
PS:莫名其妙的迷茫... 学习内容: 1.使用多线程实现文件下载... 多线程下载是加快下载速度的一种方式..通过开启多个线程去执行一个任务..可以使任务的执行速度变快..多线程的任务下载时常都 ...
- Android 多线程 异步加载
Android 应用中需要显示网络图片时,图片的加载过程较为耗时,因此加载过程使用线程池进行管理, 同时使用本地缓存保存图片(当来回滚动ListView时,调用缓存的图片),这样加载和显示图片较为友好 ...
- 异步图片下载引擎(升级版——ExecutorService+handler)
[Android分享] 异步图片下载引擎(升级版——ExecutorService+handler) [复制链接] 皮诺 13 主题 5 好友 844 积分 No.4 中级开发者 升级 2 ...
随机推荐
- ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
sqoop从mysql导入到hive报错: 18/08/22 13:30:53 ERROR tool.ImportTool: Import failed: java.io.IOException: j ...
- 【oneday_onepage】——How to stretch the life of your SSD storage
How to stretch the life of your SSD storage July 18, 2013, 9:06 PM — Once a PC enthusiast's dream st ...
- Android <meta-data>
在AndroidManifest.xml中,<meta-data>元素可以作为子元素,被包含在<activity>.<application>.<servic ...
- L0、L1及L2范数
L1归一化和L2归一化范数的详解和区别 https://blog.csdn.net/u014381600/article/details/54341317 深度学习——L0.L1及L2范数 https ...
- 【Vue】VS Code+Vue入门 Helloworld
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- wapp HTTP Error 404. The requested resource is not found.
原因: 本地80端口被占用,需要修改WAMP的默认端口 修改设置: 找到 bin/apache/apache***/conf/httpd.conf文件 将文件中的80修改为8088 修改这两个地方端口 ...
- C# 验证过滤代理IP是否有效
private void 导入IPToolStripMenuItem_Click(object sender, EventArgs e) { using (OpenFileDialog Openfil ...
- JavaScript中String和JSON互换
最简答的方式是: JSON.parse(obj) 将json对象解析为json字符串 JSON.stringify(str) 将json字符串转为json对象. 需要注意的是早期的IE浏览器是没有JS ...
- Java非递归的方式获取目录中所有文件(包括目录)
零.思路解析 对于给出的文件查看其下面的所有目录,将这个目录下的所有目录放入待遍历的目录集合中,每次取出该集合中的目录遍历,如果是目录再次放入该目录中进行遍历. 一.代码 /** * 非递归的方式获取 ...
- 腾讯QQ积分CSRF导致积分任意挥霍(我的积分为什么少了)
触发点:http://jifen.qq.com/html5/index.html?ADTAG=JIFEN.MART.INDEX 随意兑换一个商品: 因为刚才我已经兑换过了,所以积分没有了.. 没关系, ...