[原]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");
    }
}
}

下载部分:

if(GUI.Button(new Rect(0,0,100,30),"test"))
{
    string rootPath = Application.persistentDataPath;//android上保存到 /storage/sdcard0/Android/data/包名(例如:com.example.test)/files
    for(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

[原]unity3d之http多线程异步资源下载,布布扣,bubuko.com

时间: 2024-12-21 18:09:08

[原]unity3d之http多线程异步资源下载的相关文章

Cocos2d-x 3.0多线程异步资源加载

Cocos2d-x从2.x版本到上周刚刚才发布的Cocos2d-x 3.0 Final版,其引擎驱动核心依旧是一个单线程的"死循环",一旦某一帧遇到了"大活儿",比如Size很大的纹理资源加载或网络IO或大量计算,画面将 不可避免出现卡顿以及响应迟缓的现象.从古老的Win32 GUI编程那时起,Guru们就告诉我们:别阻塞主线程(UI线程),让Worker线程去做那些"大活儿"吧. 手机游戏,即便是休闲类的小游戏,往往也涉及大量纹理资源.音视频资

Cocos2d-x 3.0多线程异步资源载入

Cocos2d-x从2.x版本号到上周刚刚才公布的Cocos2d-x 3.0 Final版,其引擎驱动核心依然是一个单线程的"死循环".一旦某一帧遇到了"大活儿",比方Size非常大的纹理资源载入或网络IO或大量计算,画面将 不可避免出现卡顿以及响应迟缓的现象.从古老的Win32 GUI编程那时起,Guru们就告诉我们:别堵塞主线程(UI线程),让Worker线程去做那些"大活儿"吧. 手机游戏,即便是休闲类的小游戏,往往也涉及大量纹理资源.音视

Cocos2d-x 3.0多线程异步资源载入代码

// AppDelegate.cpp bool AppDelegate::applicationDidFinishLaunching() { - - FlashScene* scene = FlashScene::create(); pDirector->runWithScene(scene); return true; } //FlashScene.h //在FlashScene init时,我们创建一个Resource Load Thread.我们用一个ResourceLoadIndicat

[原]Unity3D深入浅出 - 认识开发环境中的自带的Package资源包

Character Controller:角色控制器 Glass Refraction(pro only):玻璃反射资源包 Image Effects :图像效果资源包 Light Cookies:光效资源包 Light Flares:光晕资源包 Particles:粒子效果资源包 Physic Materials:物理材质资源包 Projectors:幻灯机效果资源包 Scripts:脚本资源包 Skyboxes:天空盒资源包 Standard Assets(Mobile):标准资源包 Ter

[原]Unity3D深入浅出 - 新版动画系统(Mecanim)

Mecanim概述: Mecanim是Unity提供第一个丰富而复杂的动画系统,提供了: 针对人形角色的简易的工作流和动画创建能力 Retargeting(运动重定向)功能,即把动画从一个角色模型应用到另一个角色模型上的能力. 针对Animations Clips(动画片段)的简易工作流,针对动画片段及他们之间的过度和交互预览能力. 一个用于管理动画间复杂交互作用的可视化窗口. 通过不同逻辑来控制不同身体部位的运动能力. Mecanim工作流: 1.资源导入,这一阶段由美术师或动画师通过三维工具

java学习路线及资源下载,持续整理中

java学习路线及资源下载,持续整理中 学习路线图:http://blog.csdn.net/shenzhq1980/article/details/484703371.java学习经典书籍_基础编程篇下载地址:http://blog.csdn.net/shenzhq1980/article/details/48375543书籍:Java程序设计语言.(美国)阿诺德.清晰版JAVA2核心技术第1卷.基础知识7thJAVA2核心技术卷II:高级特性7th Java语言程序设计-基础篇(原书第8版)

基于headless chrome的游戏资源下载实现 (初版)

上周介绍了实现前端资源下载的思路,今天给一个简单的初版代码. 首先 基于express启动一个服务端容器,用于处理前端路由和后段逻辑处理,目录结构如下: 其中gameDir是游戏存放的地址,node_modules是存放用到插件的module,server内部目录结构如下 app.js是程序的启动代码 common 存放公用的方法 public 存放静态资源 routes 存放express路由信息 config存放一些配置信息 downLoadGame存放游戏下载的逻辑代码 view是ejs试

多线程异步加载图片

多图片多线程异步下载 开发中非常常用的就是就是图片下载,我们常用的就是SDWebImage,但是作为开发人员,不仅要能会用,还要知道其原理.本文就会介绍多图下载的实现. 本文中的示例Demno地址,下载后项目位于iOS_Demo/09-多图片多线程下载 1 - 问题 开篇我就先将多图下载过程中出现的问题摆出来,让我们能够一一克服 . 1:下载过程要放到子线程中,否则会导致UI线程卡顿 2:图片会重复下载,我们不仅要把下载完的图片放到内存中,还要把下载队列也缓存起来,否则可能图片没有下载完,会多次

[原]Unity3D深入浅出 - 光源组件(Light)

Unity中提供了四种光源: Directional light: 方向光,类似太阳的日照效果. Point light: 点光源,类似蜡烛. Spotlight: 聚光灯,类似手电筒. Area Light:区域光,无法用作实时光照,一般用于光照贴图烘培. 接下来介绍光源的参数:如下图 Type:可以选择以上介绍的四种光源类型 Range:设置光源范围的大小,从光源对象的中心发射的距离.只有Point和Spotlight有该参数. Color:光源的颜色 Instensity:光源的强度 Co