unity assetbundlebundle 可以加载两遍吗

[Unity3d]打包Assetbundle并加载
由于我们要将模型资源放在远程的服务器端,但如果直接放fbx模型是不可以加载的,所以我们可以将fbx做成预设或者是直接将其打包成assetbundle格式的,然后通过www来加载获取。
1.首先要讲一下不同平台下的一个StreamingAssets路径,这是不同的。
//不同平台下StreamingAssets的路径是不同的,这里需要注意一下。
public static readonly string PathURL =
#if UNITY_ANDROID
"jar:file://" + Application.dataPath + "!/assets/";
#elif UNITY_IPHONE
Application.dataPath + "/Raw/";
#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
//windows平台和web平台
"file://" + Application.dataPath + "/StreamingAssets/";
这就获取到了不同平台的一个路径,我们可以将打包的文件放在这些路径下,然后再从这路径去读取资源。
2.关于打包assetbundle的脚本
using UnityE
using System.C
using UnityE
public class Test : Editor
//打包单个
[MenuItem("Custom Editor/Create AssetBunldes Main")]
static void CreateAssetBunldesMain ()
//获取在Project视图中选择的所有游戏对象
Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets);
//遍历所有的游戏对象
foreach (Object obj in SelectedAsset)
//本地测试:建议最后将Assetbundle放在StreamingAssets文件夹下,如果没有就创建一个,因为移动平台下只能读取这个路径
//StreamingAssets是只读路径,不能写入
//服务器下载:就不需要放在这里,服务器上客户端用www类进行下载。
string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle";
if (BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies)) {
Debug.Log(obj.name +"资源打包成功");
Debug.Log(obj.name +"资源打包失败");
//刷新编辑器
AssetDatabase.Refresh ();
[MenuItem("Custom Editor/Create AssetBunldes ALL")]
static void CreateAssetBunldesALL ()
Caching.CleanCache ();
string Path = Application.dataPath + "/StreamingAssets/ALL.assetbundle";
Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets);
foreach (Object obj in SelectedAsset)
Debug.Log ("Create AssetBunldes name :" + obj);
//这里注意第二个参数就行
if (BuildPipeline.BuildAssetBundle (null, SelectedAsset, Path, BuildAssetBundleOptions.CollectDependencies)) {
AssetDatabase.Refresh ();
[MenuItem("Custom Editor/Create Scene")]
static void CreateSceneALL ()
//清空一下缓存
Caching.CleanCache();
string Path = Application.dataPath + "/MyScene.unity3d";
[]levels = {"Assets/Level.unity"};
//打包场景
BuildPipeline.BuildPlayer( levels, Path,BuildTarget.WebPlayer, BuildOptions.BuildAdditionalStreamedScenes);
AssetDatabase.Refresh ();
前提要新手动创建一个StreamingAssets文件夹
3.读取资源,这里只举例从本地读取,跟从网络读取是一样的,可以参考官方文档:
/Script/WWW/WWW.html
using UnityE
using System.C
public class RunScript : MonoBehaviour
//不同平台下StreamingAssets的路径是不同的,这里需要注意一下。
public static readonly string PathURL =
#if UNITY_ANDROID
"jar:file://" + Application.dataPath + "!/assets/";
#elif UNITY_IPHONE
Application.dataPath + "/Raw/";
#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
"file://" + Application.dataPath + "/StreamingAssets/";
void OnGUI()
if(GUILayout.Button("Main Assetbundle"))
//StartCoroutine(LoadMainGameObject(PathURL + "Prefab0.assetbundle"));
//StartCoroutine(LoadMainGameObject(PathURL +
"Prefab1.assetbundle"));
StartCoroutine(LoadMainCacheGameObject(PathURL + "Prefab0.assetbundle"));
StartCoroutine(LoadMainCacheGameObject(PathURL +
"Prefab1.assetbundle"));
if(GUILayout.Button("ALL Assetbundle"))
StartCoroutine(LoadALLGameObject(PathURL + "ALL.assetbundle"));
if(GUILayout.Button("Open Scene"))
StartCoroutine(LoadScene());
//读取一个资源
private IEnumerator LoadMainGameObject(string path)
WWW bundle = new WWW(path);
//加载到游戏中
yield return Instantiate(bundle.assetBundle.mainAsset);
bundle.assetBundle.Unload(false);
//读取全部资源
private IEnumerator LoadALLGameObject(string path)
WWW bundle = new WWW(path);
//通过Prefab的名称把他们都读取出来
bundle.assetBundle.Load("Prefab0");
bundle.assetBundle.Load("Prefab1");
//加载到游戏中
yield return Instantiate(obj0);
yield return Instantiate(obj1);
bundle.assetBundle.Unload(false);
private IEnumerator LoadMainCacheGameObject(string path)
WWW bundle = WWW.LoadFromCacheOrDownload(path,5);
//加载到游戏中
yield return Instantiate(bundle.assetBundle.mainAsset);
bundle.assetBundle.Unload(false);
private IEnumerator LoadScene()
WWW download = WWW.LoadFromCacheOrDownload ("file://"+Application.dataPath + "/MyScene.unity3d", 1);
var bundle = download.assetB
Application.LoadLevel ("Level");扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
_____________________________________________________________________________________________________________
问答求助版块规则:
  1、问题尽量描述清楚
& && &2、代码要放在代码块里
& && &3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
& && &4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
& && &5、问题得到解决,请选择最佳答案。
& && &6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 369|回复: 12
Unity 程序应该一次性加载AssetBundles,还是使用时加载
4437/500排名<font color="#FF昨日变化主题帖子积分
四处流浪, 积分 437, 距离下一级还需 63 积分
四处流浪, 积分 437, 距离下一级还需 63 积分
在线时间136 小时
unity 打包好了Assetbundles后,有很多,ui,房屋,人物等。我想问下这些assetbundles应该在程序启动时全部加载到内存,还是在使用时再加载,因为我怕使用时加载会卡。
[]: 一个袋子砸在了 zzzsss 头上,zzzsss 赚了 1
每日推荐:
5543/1000排名<font color="#FF昨日变化主题帖子积分
熟悉之中, 积分 543, 距离下一级还需 457 积分
熟悉之中, 积分 543, 距离下一级还需 457 积分
在线时间185 小时
AB包减少内存消耗,启动时全部加载对内存有什么大的意义吗?
每日推荐:
4437/500排名<font color="#FF昨日变化主题帖子积分
四处流浪, 积分 437, 距离下一级还需 63 积分
四处流浪, 积分 437, 距离下一级还需 63 积分
在线时间136 小时
AB包减少内存消耗,启动时全部加载对内存有什么大的意义吗?
ab包不是减少文件大小吗?还有我加载在内存中,实例化不就快了吗,如果只是内存问题的话,用prefab就行了啊。还想问问,实例化耗费时间,还是加载耗费时间
每日推荐:
2113/150排名<font color="#FF昨日变化1主题帖子积分
初来乍到, 积分 113, 距离下一级还需 37 积分
初来乍到, 积分 113, 距离下一级还需 37 积分
在线时间58 小时
全部加在了内存会爆掉的,进入场景之前加在需要用到的AB包就好
[]: wp 捡了钱没交公 蛮牛币 降了 3
每日推荐:
71769/5000排名<font color="#FF昨日变化1主题帖子积分
日久生情, 积分 1769, 距离下一级还需 3231 积分
日久生情, 积分 1769, 距离下一级还需 3231 积分
蛮牛币6780
在线时间459 小时
在有需要的关卡,,在关卡 穿越 时,loading 条 内加载 AB,,,再在你准确需要的时候实例化~~~一般是这样干的
但如果确实可以容许,比如网页游戏,他有个简摸,会先替代,随后AB ,下载,加载,实例化~~~这样玩也是可以的~
[]: 绝世love情缘 发帖时在路边捡到 2
蛮牛币,偷偷放进了口袋.
每日推荐:
4437/500排名<font color="#FF昨日变化主题帖子积分
四处流浪, 积分 437, 距离下一级还需 63 积分
四处流浪, 积分 437, 距离下一级还需 63 积分
在线时间136 小时
全部加在了内存会爆掉的,进入场景之前加在需要用到的AB包就好
就是一个场景加载一次,我现在也是这样做的,但是在切换的场景的时候。不能实例化,因为实例化会在切换 时被销毁,就只能等下一个场景切换完成再加载,这个会不会不好啊。有没有其他办法
每日推荐:
2113/150排名<font color="#FF昨日变化1主题帖子积分
初来乍到, 积分 113, 距离下一级还需 37 积分
初来乍到, 积分 113, 距离下一级还需 37 积分
在线时间58 小时
就是一个场景加载一次,我现在也是这样做的,但是在切换的场景的时候。不能实例化,因为实例化会在切换&&...
场景切换前加载和切换后加载需要的时间应该是一样的吧,感觉没啥不好的
每日推荐:
61218/1500排名<font color="#FF昨日变化主题帖子积分
蛮牛粉丝, 积分 1218, 距离下一级还需 282 积分
蛮牛粉丝, 积分 1218, 距离下一级还需 282 积分
蛮牛币2110
在线时间256 小时
赞一个赞一个赞一个赞一个赞一个赞一个赞一个赞一个赞一个赞一个赞一个赞一个赞一个赞一个
每日推荐:
4359/500排名<font color="#FF昨日变化3主题帖子积分
四处流浪, 积分 359, 距离下一级还需 141 积分
四处流浪, 积分 359, 距离下一级还需 141 积分
在线时间133 小时
我的项目都是200多万面的模型,我可以肯定的回答,是实例化慢,不是加载慢,不过加载需要考虑网速,因为我们是局域网,加载速度你不是可以计算的嘛
每日推荐:
4437/500排名<font color="#FF昨日变化主题帖子积分
四处流浪, 积分 437, 距离下一级还需 63 积分
四处流浪, 积分 437, 距离下一级还需 63 积分
在线时间136 小时
在有需要的关卡,,在关卡 穿越 时,loading 条 内加载 AB,,,再在你准确需要的时候实例化~~~一般是这样 ...
我安卓加载后出现屏幕乱码,就是花屏。
加载代码;GameObject obj = (GameObject)AssetBundle.LoadFromFile(path).LoadAsset(uienum.ToString().ToLower());
打包代码&&BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, BuildTarget.Android);
请问还有哪里可能出现问题吗
每日推荐:
4437/500排名<font color="#FF昨日变化主题帖子积分
四处流浪, 积分 437, 距离下一级还需 63 积分
四处流浪, 积分 437, 距离下一级还需 63 积分
在线时间136 小时
我的项目都是200多万面的模型,我可以肯定的回答,是实例化慢,不是加载慢,不过加载需要考虑网速,因为我 ...
我安卓加载后出现屏幕乱码,就是花屏。
加载代码;GameObject obj = (GameObject)AssetBundle.LoadFromFile(path).LoadAsset(uienum.ToString().ToLower());
打包代码&&BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, BuildTarget.Android);
请问还有哪里可能出现问题吗
每日推荐:
292/150排名<font color="#FF昨日变化1主题帖子积分
初来乍到, 积分 92, 距离下一级还需 58 积分
初来乍到, 积分 92, 距离下一级还需 58 积分
在线时间41 小时
楼主解决了吗,我先在也遇到这个问题了
每日推荐:
4437/500排名<font color="#FF昨日变化主题帖子积分
四处流浪, 积分 437, 距离下一级还需 63 积分
四处流浪, 积分 437, 距离下一级还需 63 积分
在线时间136 小时
楼主解决了吗,我先在也遇到这个问题了
按场景加载
一些小东西可以使用的时候加载
[]: 一个袋子砸在了 zzzsss 头上,zzzsss 赚了 1
每日推荐:关于Unity加载优化,你可能遇到这些问题 - 知乎专栏
{"debug":false,"apiRoot":"","paySDK":"/api/js","wechatConfigAPI":"/api/wechat/jssdkconfig","name":"production","instance":"column","tokens":{"X-XSRF-TOKEN":null,"X-UDID":null,"Authorization":"oauth c3cef7c66aa9e6a1e3160e20"}}
{"database":{"Post":{"":{"contributes":[{"sourceColumn":{"lastUpdated":,"description":"","permission":"COLUMN_PUBLIC","memberId":,"contributePermission":"COLUMN_PUBLIC","translatedCommentPermission":"all","canManage":true,"intro":"","urlToken":"uwa4d","id":18298,"imagePath":"4fecf539d0fcfce34c4b.jpeg","slug":"uwa4d","applyReason":"0","name":"UWA:简单优化、优化简单","title":"UWA:简单优化、优化简单","url":"/uwa4d","commentPermission":"COLUMN_ALL_CAN_COMMENT","canPost":true,"created":,"state":"COLUMN_NORMAL","followers":2384,"avatar":{"id":"4fecf539d0fcfce34c4b","template":"/{id}_{size}.jpeg"},"activateAuthorRequested":false,"following":false,"imageUrl":"/4fecf539d0fcfce34c4b_l.jpeg","articlesCount":109},"state":"accepted","targetPost":{"titleImage":"/v2-94d0b94a193c9bbbdb921a6b78a8af2b_r.png","lastUpdated":,"imagePath":"v2-94d0b94a193c9bbbdb921a6b78a8af2b.png","permission":"ARTICLE_PUBLIC","topics":[,27976],"summary":"接上一期的集锦后,我们再来谈谈Unity项目开发中,加载卸载资源、instantiate实例化时的一些问题。为什么加载一点点资源就卡成了翔?为什么我的项目包体那么大?如何才能达到腾飞的速度?如果你也为这些问题困扰 ,这篇关于加载…","copyPermission":"ARTICLE_COPYABLE","translatedCommentPermission":"all","likes":0,"origAuthorId":0,"publishedTime":"T11:15:54+08:00","sourceUrl":"","urlToken":,"id":1679398,"withContent":false,"slug":,"bigTitleImage":false,"title":"关于Unity加载优化,你可能遇到这些问题","url":"/p/","commentPermission":"ARTICLE_ALL_CAN_COMMENT","snapshotUrl":"","created":,"comments":0,"columnId":18298,"content":"","parentId":0,"state":"ARTICLE_PUBLISHED","imageUrl":"/v2-94d0b94a193c9bbbdb921a6b78a8af2b_r.png","author":{"bio":"招网站前端、后端、引擎功能开发实习生。有意者私信我:)","isFollowing":false,"hash":"7fdb9e2544cdf169ab0bf0b1bd9e04ba","uid":498100,"isOrg":false,"slug":"zhang-xin-81-92-50","isFollowed":false,"description":"用实力让情怀落地。","name":"张鑫","profileUrl":"/people/zhang-xin-81-92-50","avatar":{"id":"v2-4e579678fdf30dc1f03b1fd9fdd412a8","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"memberId":,"excerptTitle":"","voteType":"ARTICLE_VOTE_CLEAR"},"id":475108}],"title":"关于Unity加载优化,你可能遇到这些问题","author":"zhang-xin-81-92-50","content":"接上一期的集锦后,我们再来谈谈Unity项目开发中,加载卸载资源、instantiate实例化时的一些问题。为什么加载一点点资源就卡成了翔?为什么我的项目包体那么大?如何才能达到腾飞的速度?如果你也为这些问题困扰 ,这篇关于加载模块的QA集锦,值得你反复啃读哦!关键字资源加载、卸载Instantiate 实例化资源管理方式一、资源加载Q1:将Shader独立打包,如果我在启动游戏的时候加载一次,那么之后切换场景是不是就不用每次都加载了?确切地说,要达到后续Shader都不出现加载开销,需要满足以下两个条件:(1)包含Shader的AssetBundle文件常驻内存;(2)Shader已经全Load加载好;只要满足这两个条件,后续加载好的GameObject,但凡依赖于这些Shader的,都会直接拿来进行使用,而不会再有加载和解析开销。Q2:假设有两个界面Panel A和Panel B,它们均依赖一个共享Atlas C。AssetBundle打包时,如果我们将其分别打包的话,那么在使用时是否不能将AssetBundle C进行卸载?如果在加载Panel A和B之前,将Atlas C加载到内存中,但是将AssetBundle C进行卸载,那么在加载和实例化Panel A和B时,是否会出问题?是的,不仅是Panel和Atlas,只要是A或B依赖于C,就必须保证在加载或实例化A或B时,C的AssetBundle一定存在于内存中。如果之前将C对应的AssetBundle进行卸载,则加载或实例化A和B时,引擎将无法自动将C绑定给A和B进行使用。关于AssetBundle依赖性打包,我们已在之前的分享中有所提及。Q3:请问这个Loading.UpdatePreloading是什么东西,为什么会突然那么高?一般情况下有没有什么优化的办法?这是Unity引擎最主要的加载函数。该项一般在切换场景时或主动动态加载资源时较大。 一般来说,加载资源越多、越复杂,则其反映的Loading.UpdatePreloading耗时则越大。优化之前,必须先定位该函数的CPU占用瓶颈。下图则为我们的案例项目,Loading.UpdatePreloading函数在UWA测评报告中的总体CPU分配情况。通过这个堆栈信息,开发团队就可以对函数的耗时分配一目了然,从而有的放矢地进行优化。Q4:关于Loading.ReadObject耗费比较高,有什么推荐的方法吗?Loading.ReadObject是Unity引擎的资源加载函数,一般出现在切换场景和加载API调用时,这其中包括纹理、网格、Material、Shader、AnimationClip等资源。如果你发现该值过高,建议去大力优化加载的相关资源。对于每种资源的加载,我们正在以专题的方式进行总结和分享,建议大家可以先查看以下内容:Q5:我使用Shader.WarmupAllShaders操作,在后续加载资源还是有CreateGPUProgram出现。(Shader都在一个AssetBundle文件中,都是常驻内存的,不会删掉)是必须使用ShaderVariantCollection来加载Shader吗?以上这种问题的较大可能是:Shader被打包到不同AssetBundle中了,WarmupAllShaders仅能对当前内存中的Shader进行warm up。后续如果又有Shader加载进来,则仍然会出现CreateGPUProgram操作。建议开发团队使用,检测下AssetBundle中Shader的具体打包情况,查看是否出现了冗余打包的问题。Q6:我们在UWA上进行了性能测试,发现安卓上同步加载AssetBundle资源会非常耗CPU, 所以近期对资源加载方式做了比较大的调整,绝大部分的资源使用异步加载的形式。 不过这里有个疑问想咨询下: AssetBundle.LoadAsync 和 WWW加载方式都可以用来异步加载AssetBundle, 但是两者API特点也不同, 目前看WWW更耗内存一些, 请问这两种方式更建议使用哪一种 ?AssetBundle.LoadAsync 是在获取了 AssetBundle 对象之后加载其中的资源的;而 WWW 加载是在获取 AssetBundle,两者的作用是不同的。开发者可能是希望了解异步加载 AssetBundle 的几个 API 之间的区别,相关的接口如下:new WWW \nWWW.LoadFromCacheOrDownload\n这两种方式的具体区别可先参考中的“AssetBundle加载进阶”部分。二、资源卸载Q1:切换场景时,卸载上一个场景总感觉耗时,请问大家是否有什么推荐的方案?这是Unity在切换场景时调用Resources.UnloadUnusedAssets这个函数造成的,通常情况下其开销都是会比较大。建议开发团队通过UWA性能检测,在加载模块中进一步定位卸载场景的元凶。Q2:Resources.UnloadUnusedAssets() 不仅局限于Resources.Load的资源,还包括AssetBundle.Load的资源,是吗?是的,Resources.UnloadUnusedAssets同样可以卸载由AssetBundle.Load加载的资源,只是前提是其对应的AssetBundle已经调用Unload(false),且并没有被引用。Q3:我用UGUI做的一个界面中有一个背景图片,游戏中没有做任何处理,关闭销毁这个界面后这个图片还在内存中,但是我已经调用过了Resources.UnloadUnusedAssets,如下图所示。我的预设没有打成AssetBundle,是放在Resource路径加载的。请问是什么原因导致的呢?在使用 Resources.Load 加载 UI 界面的情况下,即使“关闭销毁这个界面”后,Resources.UnloadUnusedAssets 确实还是无法卸载对应的图集的。因为此时该图集依然被 Resources.Load 加载出来的 Prefab 引用。对于这种情况,我们的建议是手动调用 Resources.UnloadAssets 来手动释放图集(可以通过 Sprite.texture 来找到对应的图集),在重新实例化该 UI 界面时,图集也会自动进行 Reload 的。Q4:用Resources.UnloadAsset 释放未Instance的Object 会出现这样的错误 :Unload Assets may only be used on individual assets and can not be used on GameObject's/Components or AssetBundles.请问该如何解决?Resources.UnloadAsset仅能释放非GameObject和Component的资源,比如Texture、Mesh等真正的资源。对于由Prefab加载出来的Object或Component,则不能通过该函数来进行释放。Q5:我在Profiler中看到 GC.MarkDependencies 的CPU消耗有900ms+, 虽然在退出战斗的时候调用了Resources.UnloadUnusedAssets(); 可是卡顿还是很明显,请问有什么推荐的方案吗?GC.MarkDependencies的消耗是由Resources.UnloadUnusedAssets引起的。该函数的主要作用是查找并卸载不再使用的资源。游戏场景越复杂、资源越多,该函数的开销越大,一般在300~2000 ms范围内。所以,我们在UWA报告中加入了对该函数的调用监测,以便让大家更好地掌控它的调用情况。对于该函数的优化,我们建议一方面控制场景中不必要的资源量,同时通过UnloadAsset来及时卸载不再使用的资源,以减少Resources.UnloadUnusedAssets的耗时压力。后续,我们会在加载模块的相关文章中为大家详细讲解Resources.UnloadUnusedAssets的性能问题,敬请期待。Q6:我有一个UI预设,它使用了一个图集, 我在打包的时候把图集和UI一起打成了AssetBundle。我在加载生成了GameObject后立刻卸载了AssetBundle对象, 但是当我后面再销毁GameObject的时候发现图集依然存在,这是什么情况呢?这是很可能出现的。unload(false)卸载AssetBundle并不会销毁其加载的资源 ,是必须调用 Resources.UnloadUnusedAssets才行。关于AssetBundle加载的详细解释可以参考我们之前的文章:Q7:如果先Destroy Prefab ,然后将Prefab中用到的AssetBundle再进行Unload,这样的顺序是否会有问题 ? 我在手机上测试时发现这样做内存中就会一直存在,不释放;如果反过来, 就可以释放。另外,我是在Destroy 的时候调用的Resources.UnloadUnusedAssets();,请问这会影响最终的结果吗?确实可能发生这种情况,在 Resources.UnloadUnusedAssets(); 时,如果还没有进行AssetBunlde的Unload 操作,那么从AssetBunlde中加载的资源依然会因为被AssetBunlde引用而无法被卸载。 开发团队可以尝试 Destory 后做 AssetBunlde的Unload,最后进行 Resources.UnloadUnusedAssets(); 。三、管理方式Q1:现在Unity还不能将场景和 NavMesh数据或者Lightmap数据分离,是吗?我是想先加载一个干净的场景,然后再动态切入不同的光照贴图和NavMesh网格数据,有什么办法吗?Lightmap是可以与场景分离的,并且可以通过AssetBundle进行动态加载。建议将Lightmap作为普通的资源进行打包,动态加载后,通过LightmapSetting接口整体替换场景的Lightmap。目前,Navmesh确实是无法与场景分离的。但是在Unity 5.x版本以后,引擎已经允许通过LoadLevelAdditive加载多个场景的方式来加载NavMesh,因此,研发团队可以尝试预先将NavMesh在多个场景内烘焙好,然后通过LoadLevelAddtive或类似API来进行加载,从而达到动态加载NavMesh的效果。Q2:从点击应用到出现游戏画面,这个时间长短是不是和Resource目录大小有关系?从点击应用到首次出现应用画面,其加载时间主要与两方面相关:1、Resources文件夹中的资源数量。在游戏启动时,Unity引擎会为Resources文件夹下的资源建立一个查找树来存放与其对应的索引,便于后续资源的加载。一般来说,Resouces文件夹下资源数量越多,其构建时间越长,应用的启动也就越慢;2、首场景的资源加载和相关代码的初始化工作。如果首场景的资源量较多,其脚本初始化的任务较重,则应用的启动时间也会越慢。Q3:AssetBundle在使用时解压出来的资源会占用一定的内存。我们现在想尝试使用两种加载方式:(1)在AssetBundle加载相关的资源后,将资源进行缓存,并卸载AssetBundle文件;(2)对AssetBundle文件进行缓存,以后用到相关资源后再进行直接进行加载。请问这两种方式你们推荐哪一种比较好?对于Unity 5.3版本之前的项目,建议通过LoadFromCacheOrDownload或LoadFromFile的方式来加载AssetBundle,这样既可以降低Assetbundle对象的内存占用,又可以保持AssetBundle与资源之间的链接关系,从而方便后续具有依赖关系的Prefab的加载。对于Unity 5.3版本之后的项目,可以从AssetBundle打包本身进行处理。即:使用LZ4格式的AssetBundle文件,而不使用默认的LZMA格式。同样可以达到上述的需求,稍有不足的是,LZ4格式的AssetBundle文件较之LZMA格式的文件占用稍大。如果是依赖关系打包,对于被依赖的共享资源AssetBundle文件,我们还是建议将其缓存在内存中,虽有一定的内存增加,但可以通过上述办法极大地降低内存上的占用,缓解内存压力。Q4:怎样动态加载Navmesh?目前Navmesh不支持动态加载,只能随场景一起加载, 因此可以考虑将带有Navmesh的场景打包成AssetBundle,然后使用LoadLevel加载AssetBundle中的场景。Navmesh的动态加载已经在Unity的Roadmap中。而当前,Navmesh是和场景绑定的,也就是说目前只能通过LoadLevel(不支持& & LoadLevelAdditive的加载方式)来加载场景的同时,自动加载对应的Navmesh数据。替代方案是:将多个“场景Prefab”的Navmesh 合并到同一个场景中烘焙好(互不重叠),然后再将这些“场景Prefab”分离到各个单独的场景中去;在运行阶段,Navmesh随着第一个场景一次性加载,而对于其他的场景物件,再通过LoadLevelAdditive来加载对应的场景即可。缺点是为了使场景物件对齐Navmesh,在场景制作时就不能出现坐标上的重叠,因此仅供参考。在Unity 5.x下,Lightmap的动态加载,需要通过脚本将烘焙时每个物件的Lightmapindex和Lightmapscaleoffset记录下,并在运行时动态加载后设置回去的方式来实现。因为目前Lightmapindex和Lightmapscaleoffset信息是和场景绑定在一起,储存在Lightmapsnap.assets 中,发布时也是放在场景信息中,因此不会记录在Prefab 上。Q5:同一个纹理,有多个Prefab生成的实例,会有多份这个纹理的copy吗?该问题需要查看 Prefab 的具体加载方式。如果仅是通过 Resources.Load 进行加载,那么纹理是不会存在多份的,但如果是通过AssetBundle加载,每个 Prefab 均为一个 AssetBundle 且纹理没有进行依赖关系打包的话,那么纹理资源确实会在内存中存在多份。如果你发现了内存中存在多份相同纹理,且是通过 AssetBundle 文件来加载资源的,则建议将 AssetBundle 上传到UWA网站()中,其资源检测工具能协助开发团队高效检测并定位AssetBundle中的冗余资源。四、Instantiate 实例化Q1:我在第一次执行GameObject.Instantiate一些资源的时候会卡(当时加载当时就实例的情况),有的复杂资源甚至在第一次GameObject.Instantiate的时候会卡70多毫秒,造成明显的卡顿,请问有什么好的解决方案吗?Instantiate的卡顿与三部分开销相关:相关资源加载、脚本组件的序列化和构造函数的执行,并且绝大部分原因均是相关资源加载导致。所以,我们的建议如下:1、通过 Profiler 查看 Instantiate 具体的CPU分配情况;2、如果是资源加载导致的性能瓶颈,则一方面通过简化资源来缓解CPU耗时压力,另一方面通过 AssetBundle 依赖关系打包将资源预先加载,即将此处 Instantiate 的总体耗时拆分,平摊到之前帧进行执行(比如切换场景处等),从而让 Instantiate 实例化操作的局部耗时更加平滑;3、如果是脚本组件序列化导致的性能瓶颈,则可尝试减少脚本中的序列化信息;4、如果是构造函数的执行导致的性能瓶颈,一般只能在策略上进行规避,比如降低 Instantiate 的调用频率等。针对资源加载部分,我们近期正以专题的形式连载中,后续会对其Instantiate实例化的调用进行更为详细的分析,敬请期待。","updated":"T03:15:54.000Z","canComment":false,"commentPermission":"anyone","commentCount":3,"collapsedCount":0,"likeCount":19,"state":"published","isLiked":false,"slug":"","lastestTipjarors":[],"isTitleImageFullScreen":false,"rating":"none","titleImage":"/v2-94d0b94a193c9bbbdb921a6b78a8af2b_r.png","links":{"comments":"/api/posts//comments"},"reviewers":[],"topics":[{"url":"/topic/","id":"","name":"Unity(游戏引擎)"},{"url":"/topic/","id":"","name":"手机游戏开发"},{"url":"/topic/","id":"","name":"性能优化"}],"adminClosedComment":false,"titleImageSize":{"width":1065,"height":382},"href":"/api/posts/","excerptTitle":"","column":{"slug":"uwa4d","name":"UWA:简单优化、优化简单"},"tipjarState":"activated","tipjarTagLine":"真诚赞赏,手留余香","sourceUrl":"","pageCommentsCount":3,"tipjarorCount":0,"annotationAction":[],"hasPublishingDraft":false,"snapshotUrl":"","publishedTime":"T11:15:54+08:00","url":"/p/","lastestLikers":[{"bio":"Ever","isFollowing":false,"hash":"18b3bfd6d4fb30b5072c1","uid":08,"isOrg":false,"slug":"fan-chuang-4","isFollowed":false,"description":"","name":"米斯特樊","profileUrl":"/people/fan-chuang-4","avatar":{"id":"3d8e3b492f76c3f432f0d98f76ef7e43","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"赫赫业业的码农","isFollowing":false,"hash":"0abdf723fdd58e407ee715b19d2bfcaa","uid":268700,"isOrg":false,"slug":"xie-yun-rong-54","isFollowed":false,"description":"","name":"葉蕓榕","profileUrl":"/people/xie-yun-rong-54","avatar":{"id":"da8e974dc","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"程序猿/吉他爱好者","isFollowing":false,"hash":"5db13f45f7bd35a5c1a6","uid":924900,"isOrg":false,"slug":"aplysia","isFollowed":false,"description":"","name":"aplysia","profileUrl":"/people/aplysia","avatar":{"id":"cff7de9ede4","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"西方的哪一个国家我没去过?","isFollowing":false,"hash":"b1a7bca6310","uid":04,"isOrg":false,"slug":"goddie","isFollowed":false,"description":"长者脑残粉。","name":"哥哥","profileUrl":"/people/goddie","avatar":{"id":"cf4b9e6f7c27b27a0cc7e0b6","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"游戏业, 擅长游戏,心理学,nlp,豆知识","isFollowing":false,"hash":"ea89a004e16fafcae9c785e","uid":60,"isOrg":false,"slug":"li-feng-89","isFollowed":false,"description":"","name":"李峰","profileUrl":"/people/li-feng-89","avatar":{"id":"da8e974dc","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false}],"summary":"接上一期的集锦后,我们再来谈谈Unity项目开发中,加载卸载资源、instantiate实例化时的一些问题。为什么加载一点点资源就卡成了翔?为什么我的项目包体那么大?如何才能达到腾飞的速度?如果你也为这些问题困扰 ,这篇关于加载…","reviewingCommentsCount":0,"meta":{"previous":{"isTitleImageFullScreen":false,"rating":"none","titleImage":"/50/v2-6f07c5145bf8fbfd32cfdf4_xl.jpg","links":{"comments":"/api/posts//comments"},"topics":[{"url":"/topic/","id":"","name":"Unity(游戏引擎)"},{"url":"/topic/","id":"","name":"性能优化"},{"url":"/topic/","id":"","name":"手机游戏开发"}],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"招网站前端、后端、引擎功能开发实习生。有意者私信我:)","isFollowing":false,"hash":"7fdb9e2544cdf169ab0bf0b1bd9e04ba","uid":498100,"isOrg":false,"slug":"zhang-xin-81-92-50","isFollowed":false,"description":"用实力让情怀落地。","name":"张鑫","profileUrl":"/people/zhang-xin-81-92-50","avatar":{"id":"v2-4e579678fdf30dc1f03b1fd9fdd412a8","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"column":{"slug":"uwa4d","name":"UWA:简单优化、优化简单"},"content":"谈及GPU,我们知道它负责整个渲染流水线,从处理CPU传递过来的模型数据开始,进行Vertex Shader、Fragment Shader等一系列工作,最后输出屏幕上的每个像素。而对于目前越来越高的分辨率屏幕和越来越华丽的游戏或VR应用,GPU的性能总是不够用。◆Overdraw该模块可以帮助用户直接查看项目运行时每帧都渲染的像素数量,从而反映出设备GPU端所承受的压力。我们可以看到下面的图片中有地方是黑色,有地方是红色。颜色越红,表示该处像素在当前帧中被填充的次数较多,进而GPU的压力也就越大。移动VR开发者需要特别关注这部分的情况。下图是性能检测报告中的GPU模块页面,我们提供四个参数供开发者进行参考:总填充数峰值项目运行过程中,单帧填充像素的数量峰值。总填充数均值项目运行过程中,平均每帧的填充像素数量。上述两个参数中,单位为M,表示的是百万,即10.4M表示总填充像素数量为一千零四十万。填充倍数峰值项目运行过程中,单帧中整个屏幕被填充的倍数峰值;倍数越高,则GPU的压力越大。填充倍数均值项目运行过程中,平均每帧的填充的倍数均值;倍数越高,则GPU的压力越大。在这里,用户可以对图表进行交互操作。我们提供了两类截图,一类是原始截图,一类则是Overdraw截图。通过该模块,研发团队可以:对GPU压力有更加深入的认识,对Overdraw较高的不合理操作及时进行优化;更直观地看到粒子系统、UI的制作是否存在问题。◆◆Mipmap用户可以直接查看项目运行时,每帧纹理在渲染时所用的Mipmap层级,从而来进一步查看其纹理的尺寸使用是否合理。如上图,在该页面中,我们通过不同颜色来表示纹理所用的层级。紫色(4x):表示此处所用纹理的长和宽均被拉伸了4倍,在这种情况下很有可能造成纹理模糊。蓝色(2x):表示此处所用纹理的长和宽均被拉伸了2倍,在这种情况下也有可能造成纹理模糊。黑色:表示此处所用的纹理刚好合适,页面中黑色区域越大越好。橙色(1/2):表示此处所用纹理为原始纹理的Mipmap第1层,即所用的真实纹理其长宽均为原始纹理的0.5倍。绿色(1/4):表示此处所用纹理为原始纹理的Mipmap第2层,即所用的真实纹理其长宽均为原始纹理的0.25倍。红色(1/8):表示此处所用纹理为原始纹理的Mipmap第3层,即所用的真实纹理其长宽均为原始纹理的0.125倍。如果研发团队经常发现某些物体的颜色为橙色、绿色或红色,则建议研发团队尝试降低原始纹理的分辨率,这样既不会造成视觉效果的损失,又可以降低其内存占用和包体大小。目前该GPU模块仅支持Android设备。当然,这只是UWA开启GPU优化的第一步,后续还会不断完善我们的功能,实现对iOS、PC和其他平台的支持,并通过更多的项目性能分析从而对参数进行学习归纳总结,力争为大家提供行业性的参考标准。走一步,再走一步!","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T14:07:16+08:00","url":"/p/","title":"UWA新功能| GPU性能优化,One Step!","summary":"谈及GPU,我们知道它负责整个渲染流水线,从处理CPU传递过来的模型数据开始,进行Vertex Shader、Fragment Shader等一系列工作,最后输出屏幕上的每个像素。而对于目前越来越高的分辨率屏幕和越来越华丽的游戏或VR应用,GPU的性能总是不够用。","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":0,"likesCount":6},"next":{"isTitleImageFullScreen":false,"rating":"none","titleImage":"/50/v2-b4a4fd537042bbbbd37721b5ecb2f279_xl.jpg","links":{"comments":"/api/posts//comments"},"topics":[{"url":"/topic/","id":"","name":"Unity(游戏引擎)"},{"url":"/topic/","id":"","name":"手机游戏开发"},{"url":"/topic/","id":"","name":"性能优化"}],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"招网站前端、后端、引擎功能开发实习生。有意者私信我:)","isFollowing":false,"hash":"7fdb9e2544cdf169ab0bf0b1bd9e04ba","uid":498100,"isOrg":false,"slug":"zhang-xin-81-92-50","isFollowed":false,"description":"用实力让情怀落地。","name":"张鑫","profileUrl":"/people/zhang-xin-81-92-50","avatar":{"id":"v2-4e579678fdf30dc1f03b1fd9fdd412a8","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"column":{"slug":"uwa4d","name":"UWA:简单优化、优化简单"},"content":"还记得两年前在畅销榜上惊鸿一瞥的重度ARPG手游《Implosion聚爆》吗?即使你未把玩过该游戏,也一定为其60人民币的“天价”惊艳过吧。极致精细的美术画面,令人畅汗淋漓的格斗打击感,却依然能在低端机上无完美运行—你可知道近万小时后的性能优化后,它的性能已经到达令人发指的地步!本期UWA技术直播,我们来为你揭秘这款超级手游背后的细节!直播时间:11月22日(周二) 晚上8点开始直播平台:斗鱼直播房间:787192 地址:当我们还在询问内存的推荐值设定为多少,GC调用在多少范围内才合理时,《Implosion聚爆》团队的研发人员已经把目标聚集在了更远的地方。以下是该性能的部分数据,让我们先来一睹为快!CPU性能在红米2上运行的18143帧中,超过33ms的帧数占比为11.1%,在华为6Plus上运行的16026帧中,超过33ms的帧数占比为8.7%。NGUI模块总体在红米2上的CPU占用主要集中在 0.1~3.0ms 范围内(5%~95%),堆内存累积分配仅用了 6.6MB !以上只是冰山一角,我们将在直播当天全方位展现其性能的每个细节!同时,UWA的新功能:等也将首次在直播中露脸了呢。每次的报告越来越丰富啦,小编希望大家能常阅常新,每次都能收获新鲜的解读。友情提示直播过程中欢迎在弹幕中讨论。我们会保留充裕的交流时间,与大家知无不言言无不尽。同学们也可以提前储备好本期内容的相关问题,在此篇文章底部留言,主播会优先答复哦!没能赶上本次直播时间的朋友不要着急,我们会有视频录制,请关注官方微信的推送哦。 (二维码自动识别)","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T12:24:56+08:00","url":"/p/","title":"该游戏的性能已经到达令人发指的程度! |UWA技术直播 !","summary":"还记得两年前在畅销榜上惊鸿一瞥的重度ARPG手游《Implosion聚爆》吗?即使你未把玩过该游戏,也一定为其60人民币的“天价”惊艳过吧。极致精细的美术画面,令人畅汗淋漓的格斗打击感,却依然能在低端机上无完美运行—你可知道近万小时后的性能优化后,它的…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":14,"likesCount":13}},"annotationDetail":null,"commentsCount":3,"likesCount":19,"FULLINFO":true}},"User":{"zhang-xin-81-92-50":{"isFollowed":false,"name":"张鑫","headline":"用实力让情怀落地。","avatarUrl":"/v2-4e579678fdf30dc1f03b1fd9fdd412a8_s.jpg","isFollowing":false,"type":"people","slug":"zhang-xin-81-92-50","bio":"招网站前端、后端、引擎功能开发实习生。有意者私信我:)","hash":"7fdb9e2544cdf169ab0bf0b1bd9e04ba","uid":498100,"isOrg":false,"description":"用实力让情怀落地。","profileUrl":"/people/zhang-xin-81-92-50","avatar":{"id":"v2-4e579678fdf30dc1f03b1fd9fdd412a8","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false,"badge":{"identity":null,"bestAnswerer":null}}},"Comment":{},"favlists":{}},"me":{},"global":{"experimentFeatures":{"ge3":"ge3_9","ge2":"ge2_1","nwebStickySidebar":"sticky","nwebAnswerRecommendLive":"newVersion","newMore":"new","sendZaMonitor":"true","liveReviewBuyBar":"live_review_buy_bar_2","liveStore":"ls_a2_b2_c1_f2","homeUi2":"default","answerRelatedReadings":"qa_recommend_by_algo_related_with_article","qrcodeLogin":"qrcode","newBuyBar":"liveoldbuy","newMobileColumnAppheader":"new_header","zcmLighting":"zcm","favAct":"default","appStoreRateDialog":"close","mobileQaPageProxyHeifetz":"m_qa_page_nweb","iOSNewestVersion":"4.2.0","default":"None","wechatShareModal":"wechat_share_modal_show","qaStickySidebar":"sticky_sidebar","androidProfilePanel":"panel_b"}},"columns":{"next":{},"uwa4d":{"following":false,"canManage":false,"href":"/api/columns/uwa4d","name":"UWA:简单优化、优化简单","creator":{"slug":"zhang-xin-81-92-50"},"url":"/uwa4d","slug":"uwa4d","avatar":{"id":"4fecf539d0fcfce34c4b","template":"/{id}_{size}.jpeg"}}},"columnPosts":{},"columnSettings":{"colomnAuthor":[],"uploadAvatarDetails":"","contributeRequests":[],"contributeRequestsTotalCount":0,"inviteAuthor":""},"postComments":{},"postReviewComments":{"comments":[],"newComments":[],"hasMore":true},"favlistsByUser":{},"favlistRelations":{},"promotions":{},"switches":{"couldAddVideo":false},"draft":{"titleImage":"","titleImageSize":{},"isTitleImageFullScreen":false,"canTitleImageFullScreen":false,"title":"","titleImageUploading":false,"error":"","content":"","draftLoading":false,"globalLoading":false,"pendingVideo":{"resource":null,"error":null}},"drafts":{"draftsList":[],"next":{}},"config":{"userNotBindPhoneTipString":{}},"recommendPosts":{"articleRecommendations":[],"columnRecommendations":[]},"env":{"edition":{},"isAppView":false,"appViewConfig":{"content_padding_top":128,"content_padding_bottom":56,"content_padding_left":16,"content_padding_right":16,"title_font_size":22,"body_font_size":16,"is_dark_theme":false,"can_auto_load_image":true,"app_info":"OS=iOS"},"isApp":false},"sys":{},"message":{"newCount":0},"pushNotification":{"newCount":0}}

我要回帖

更多关于 unity5 assetbundle 的文章

 

随机推荐