[原]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 = 1024;public Stream OrginalStream;public HttpWebResponse WebResponse;public WebReqState(string path){Buffer = new byte[1024];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('/')[4];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,0,WebReqState.BufferSize,new AsyncCallback(ReadDataCallback),st); }void ReadDataCallback(IAsyncResult ar) {WebReqState rs = ar.AsyncState as WebReqState;int read =rs.OrginalStream.EndRead(ar);if(read>0){rs.fs.Write(rs.Buffer,0,read);rs.fs.Flush();rs.OrginalStream.BeginRead(rs.Buffer, 0, WebReqState.BufferSize, new AsyncCallback(ReadDataCallback), rs);}else{rs.fs.Close();rs.OrginalStream.Close();rs.WebResponse.Close();Debug.Log(assetName+":::: success");} } }
View Code
下载部分:
if(GUI.Button(new Rect(0,0,100,30),"test")) {string rootPath = Application.persistentDataPath;//android上保存到 /storage/sdcard0/Android/data/包名(例如:com.example.test)/filesfor(int i =0;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[0]);help.AsyDownLoad("http://192.168.0.103/unity/"+fileName[1]+".AssetBundle");//注意在手机上测试 该对Ip地址 }
下载完成后 可以去/storage/sdcard0/Android/data/包名(例如:com.example.test)/files查找对应文件
加载部分:
if(GUI.Button(new Rect(0,30,100,30),"load")) {for(int i =0;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*2,0,0),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
转载于:https://www.cnblogs.com/U-tansuo/p/unity3d_Threading_AsyDown_HTTP.html
[原]unity3d之http多线程异步资源下载相关推荐
- 3D引擎多线程:资源异步加载
本文原创版权归 博客园 flagship 所有,如有转载,请详细标明作者及原文出处,以示尊重! 作者:flagship 原文:3D引擎多线程:资源异步加载 资源异步加载恐怕是3D引擎中应用最为广泛的多 ...
- ubuntu资源下载利器:多线程、断点续传下载工具mwget的安装与使用
ubuntu资源下载利器:多线程.断点续传下载工具mwget的安装与使用
- 《PHP和MySQL Web 开发,原书第4版》光盘/源代码/资源/下载
<PHP和MySQL Web 开发,原书第4版> 光盘/源代码/资源/下载 http://www.china-pub.com/195187&ref=ps 下载您需要的更新文件(包括 ...
- Python|并发编程|爬虫|单线程|多线程|异步I/O|360图片|Selenium及JavaScript|Scrapy框架|BOM 和 DOM 操作简介|语言基础50课:学习(12)
文章目录 系列目录 原项目地址 第37课:并发编程在爬虫中的应用 单线程版本 多线程版本 异步I/O版本 总结 第38课:抓取网页动态内容 Selenium 介绍 使用Selenium 加载页面 查找 ...
- Visual C++串口通信编程---多线程异步方式
Visual C++串口通信编程---多线程异步方式 1. 串口通信基础 提到串口让人想起并口,它们是计算机中两个比较重要的通信方式. 串口:也叫COM口,把字节的二进制位按位列队进行传输,每个字节占 ...
- Fork and Join: Java也可以轻松地编写并发程序 原文地址 作者:Julien Ponge 译者:iDestiny 资源下载: Java SE 7 Sample Code(Zi
Fork and Join: Java也可以轻松地编写并发程序 原文地址 作者:Julien Ponge 译者:iDestiny 资源下载: Java SE 7 Sample Code(Zip) ...
- Python爬虫【四】爬取PC网页版“微博辟谣”账号内容(selenium多线程异步处理多页面)
专题系列导引 爬虫课题描述可见: Python爬虫[零]课题介绍 – 对"微博辟谣"账号的历史微博进行数据采集 课题解决方法: 微博移动版爬虫 Python爬虫[一]爬取移 ...
- 高并发多线程分片断点下载
基于Java的高并发多线程分片断点下载 首先直接看测试情况: 单线程下载72MB文件 7线程并发分片下载72MB文件: 下载效率提高2-3倍,当然以上测试结果还和设备CPU核心数.网络带宽息息相关. ...
- 医学教育网批量资源下载程序之——完成
2019独角兽企业重金招聘Python工程师标准>>> 大家好! 经过好长时间的拆腾,终于实现了 "医学教育网批量资源下程序" . 相关的博文: 医学教育网批量资 ...
最新文章
- web设计经验一 提升移动设备响应式设计的8个建议
- C++走向远洋——61(项目一、排序函数模板)
- hdu4530 水题
- JVM(一) ---JVM的数据模型
- VTK:图片之ImageValueRange
- SQL Server Management Studio消失了
- Android-TextView跑马灯效果
- docker安装rabbitmq步骤
- Git GUI,Git Bash,Git CMD标签之间的区别
- NSS_08 extjs表单验证
- iOS获取iPhone系统等信息和服务器返回空的异常处理
- QA面试题:之一(中英文题目、难度:简单)
- git2.23.0下载git2.25.0下载git2.27.0下载百度云
- 利用Eigen求广义逆矩阵
- Linux 系统编程 --文件IO-write()、read()、lseek()函数
- 发光环绕文字特效怎么做?教程来了
- 新生儿的二类(自费)疫苗(截止2019年)
- 【算法编程】乘方取模
- 基于SSM大学生宿舍交电费系统
- explain的使用及详解