Assetbundle管理与加载
最近在做项目优化的时候发现公司的项目用的还是老式的WWW去加载assetbundle资源的形式,而且是通过在两个Update里面分开加载AB和Asset的,这样虽然避免了协程的的使用,但是把一件事分开成了两件事,而且是需要每一帧都要在Update里面去检测,这样会加重Update里面的逻辑负担,所以我自己就重新用协程去写了一套资源加载。
---------------------
1 对比WWW与LoadFromFile
首先WWW是一种以数据流的形式把AB加载到内存里面,他会在初始化的时候去构造网络连接对象,一种类似socket的东西,而且他会在每次初始化的时候去创建WWW对象,如果不做一个对象池去管理的话会造成对象过多而出发GC,严重的话会导致游戏卡顿,而且Unity官网上也推荐用LoadFromFIle的形式去加载AB,我去测了下,WWW与LoadFromFIle在速度上的差别,LoadFromFIle可以节省约1/3的时间,所以果断舍弃掉WWW。
---------------------
2 使用协程还是使用Update去加载
使用Update去加载的话相当于是把加载Asset与AB分开来,这样我需要在不同的脚本去处理这两件事,会显得逻辑上很复杂,而且每一帧都要在Update检测,这样让逻辑很难被剥离出来。而用协程去实现的话,协程本身会存在一定的开销,而且协程开启过多也会造成GC,但是资源加载本身就不应该一次性加载过多的资源,所以协程的数量是可以控制的,那么协程的开销也可以忽略不计了,其次是协程把加载Asset与AB结合到了一起,变成了一件事,这样让逻辑更清晰,我只需要去关心这个协程是如何加载AB与Asset就行了,而且也很容易剥离开来。
---------------------
3 AssetBundle的依赖以及引用计数
我们都知道在打包出来的AB中会有两个文件,一个是AB包,一个是manifest文件,而manifest文件中就记录了这个AB包所有的资源的名字等相关信息,以及AB包所引用的资源,这样的话我们就可以做一个工具用来检测所有AB包中是否存在相同的资源,我们就可以把这些重复的资源单独出来打成一个AB包,而运行时加载依赖的话,需要把 BuildPipeline.BuildAssetBundles设置的输出目录下的AB中的资源加载出来,转换为AssetBundleManifest。而AB的引用是会在加载AB的时候用到,主要是为了我们卸载资源,因为如果我们在加载完AB包之后没有做引用计数的话,如果A依赖了B,C也依赖了B,A与C同时加载到场景中,如果没有做引用计数,卸载A的时候会把B也卸载掉,那么C就会出现资源丢失的情况;此外还会出现内存泄露的情况,所以我们需要去维护一个引用计数,来保证正常的卸载。
---------------------
4 设计思路
首先我们需要明白我们加载AB包需要写什么东西,需要一个AB名,一个Asset名,一个回调函数,一个引用计数,一个依赖数组,一个AB的加载状态,一个Asset加载状态
---------------------
5 AssetBundleManager
Assetbundle不能一次性加载过多,否在会造成异步加载时被Lock,用profiler工具可以看到,所以我设置了一个队列每次从队列中取5个来加载,不同的项目可以根据自己的需要去设置最大加载数量,然后5个加载完了再去检查队列中还有Request没,如果有则等这帧完了再加载。在释放资源的时候提供立即释放与延迟释放的选择。然后剩下是加载场景,因为场景的加载接口是单独的,但是加载AB部分是一样的,所以就留给大家自己去完成了
---------------------
原文:https://blog.csdn.net/tc3819171/article/details/79123800
Assetbundle管理与加载的更多相关文章
- Unity5 AssetBundle 打包以及加载
using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEditor; us ...
- unity中ScriptableObject在assetbundle中的加载
转载请标明出处:http://www.cnblogs.com/zblade/ 以前都是写一些个人的调研博客,从今天开始,也写一些个人在开发中遇到的一些可以分享的趟坑博客,为后续的开发人员提供一些绵薄之 ...
- Assetbundle创建与加载
[Assetbundle创建与加载] Unity有两种动态加载机制:一种是Resource.Load.一种是AssetBundle.Assetbundle是Unity Pro提供的功能,它可以把多个游 ...
- Unity3d 5.x AssetBundle打包与加载
1.AssetBundle打包 unity 5.x版本AssetBundle打包,只需要设置好AssetBundle的名称后,unity会自动将其打包,无需处理其他,唯独需要做的是设置好个AssetB ...
- Unity5 AssetBundle系列——资源加载卸载以及AssetBundleManifest的使用
下面代码列出了对于assetbundle资源的常用操作,其中有针对bundle.asset.gameobject三种类型对象的操作,实际使用中尽量保证成对使用. 这一块的操作比较繁琐,但只要使用正确, ...
- [Unity] unity5.3 assetbundle打包及加载
Unity5.3更新了assetbundle的打包和加载api,下面简单介绍使用方法及示例代码. 在Unity中选中一个prefab查看Inspector窗口,有两个位置可以进行assetbundle ...
- Unity -- AssetBundle(本地资源加载和加载依赖关系)
1.本地资源加载 1).建立Editor文件夹 2).建立StreamingAssets文件夹和其Windows的子文件夹 将下方第一个脚本放入Editor 里面 脚本一 资源打包AssetBund ...
- vue后端返回路由表来进行权限管理,加载指定路由结构,不包含则不加载
创建vue项目,配置环境变量,后续需要用到.这里只配置生产环境和开发环境. 项目根目录创建 .env.production 文件 NODE_ENV=production VUE_APP_URL=htt ...
- [转]全面理解Unity加载和内存管理
[转]全面理解Unity加载和内存管理 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质 ...
随机推荐
- 【CSS】Sass理解
原文在 https://github.com/zhongxia245/blog , 欢迎 star! Sass理解 时间:2016-09-24 22:56:12 作者:zhongxia 这里就不讲解S ...
- node+koa中转层开发实践总结
node中转层的意义: 1.能解决前后端代码部署在不同服务器下时的跨域问题.(实现) 2.合并请求,业务逻辑处理.(实现) 3.单页应用的首屏服务端渲染.(暂未实现) 环境准备: node: ^8.1 ...
- nowcoder练习赛28
https://www.nowcoder.com/acm/contest/200#question 最近突然找到了打比赛的乐趣,于是参加了这场比赛. 生日宴会:https://www.nowcoder ...
- [JSOI2008]星球大战starwar
嘟嘟嘟 维护联通块自然想到并查集,然而题中说是删边,不是很好做,因此我们可以离线下来然后倒序操作,就变成了添加边的同时维护联通块数量. 首先我们把k次打击后剩的边都添加到图中,表示倒序时的初始状态.然 ...
- OpenCV——ORB特征检测与匹配
原文链接:https://mp.weixin.qq.com/s/S4b1OGjRWX1kktefyHAo8A #include <opencv2/opencv.hpp> #include ...
- SNAT和DNAT
1.SNAT iptables防火墙 Centos6.6 64位 iptables 内网:eth0 172.16.4.1 外网:eth 112.112.112.112/24 当有用户访问公网时,修改用 ...
- .net 设置Webbowser 版本
.net 里的Webbowser控件默认情况是用IE7来渲染 可修改注册表试用是最新的版本来渲染: using System; using System.Collections.Generic; us ...
- python基础1之python介绍、安装、变量和字符编码、数据类型、输入输出、数据运算、循环
开启python之路 内容概要: 一.python介绍 二.安装 三.第一个python程序 四.变量和字符编码 五.用户输入 六.数据类型 七.一切皆对象 八.数据运算 九.if else 流程判断 ...
- 20155334 《网络攻防》 Exp7 网络欺诈防范
20155334 <网络攻防> Exp7 网络欺诈防范 一.基础问题回答 通常在什么场景下容易受到DNS spoof攻击 同一局域网下,以及各种公共网络. 在日常生活工作中如何防范以上两攻 ...
- sinopia 搭建记录
最近公司有个问题,一些公共部分每次都要手动发送,放到 git 上涉及到父子 git 问题,现在就想在内部搭建一个 npm,涉及到公共模块了就直接 npm update 更新一下.找到了 sinopia ...