关于Unity加载优化,你可能遇到这些问题

  • 时间:
  • 浏览:0
  • 来源:大发UU快3APP—大发UU快三

该问题图片需用查看 Prefab 的具体加载土措施。肯能仅是通过 Resources.Load 进行加载,这么纹理是不用发生多份的,但肯能是通过AssetBundle加载,每个 Prefab 均为一一个多 多 AssetBundle 且纹理这么进行依赖关系打包一段话,这么纹理资源确实会在内存中发生多份。肯能你发现了内存中发生多份相同纹理,且是通过 AssetBundle 文件来加载资源的,则建议将 AssetBundle 上传到UWA网站(www.uwa4d.com)中,其资源检测工具能协助开发团队高效检测并定位AssetBundle中的冗余资源。

以上四种 问题图片的较大肯能是:Shader被打包到不同AssetBundle中了,WarmupAllShaders仅能对当前内存中的Shader进行warm up。后续肯能又有Shader加载进来,则仍然会一一个多劲跳出CreateGPUProgram操作。

Q4:怎么才能 才能 动态加载Navmesh?

Q1:我在第一次执行GameObject.Instantiate或多或少资源的让你会卡(当时加载当时就实例的情形),有的复杂性资源甚至在第一次GameObject.Instantiate的让你会卡70多毫秒,造成明显的卡顿,请问有那此好的解决方案吗?

Q3:AssetBundle在使用时解压出来的资源会占用一定的内存。亲戚亲戚朋友现在想尝试使用四种 加载土措施:(1)在AssetBundle加载相关的资源后,将资源进行缓存,并卸载AssetBundle文件;(2)对AssetBundle文件进行缓存,让你用到相关资源后再进行直接进行加载。请问这四种 土措施亲戚亲戚朋友推荐哪四种 比较好?

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.请问该怎么才能 才能 解决?

Q3:请问四种 Loading.UpdatePreloading是那此东西,为那此会一一个多劲这么高?一般情形下有这么那此优化的土措施?

肯能是依赖关系打包,对于被依赖的共享资源AssetBundle文件,亲戚亲戚朋友还是建议将其缓发生内存中,虽有一定的内存增加,但还需用通过上述土措施极大地降低内存上的占用,缓解内存压力。

Lightmap是还需用与场景分离的,倘若还需用通过AssetBundle进行动态加载。建议将Lightmap作为普通的资源进行打包,动态加载后,通过LightmapSetting接口整体替换场景的Lightmap。目前,Navmesh确实是无法与场景分离的。倘若在Unity 5.x版本让你,引擎肯能允许通过LoadLevelAdditive加载多个场景的土措施来加载NavMesh,倘若,研发团队还需用尝试预先将NavMesh在多个场景内烘焙好,倘若通过LoadLevelAddtive或相似于API来进行加载,从而达到动态加载NavMesh的效果。

是的,不仅是Panel和Atlas,只所以 A或B依赖于C,就需用保证在加载或实例化A或B时,C的AssetBundle一定发生于内存中。肯能让你将C对应的AssetBundle进行卸载,则加载或实例化A和B时,引擎将无法自动将C绑定给A和B进行使用。

关于AssetBundle依赖性打包,亲戚亲戚朋友已在让你的分享【揭开AssetBundle庐山真面目】饱含所提及。

Q5:同一一个多 多纹理,有多个Prefab生成的实例,会有多份四种 纹理的copy吗?

这是Unity在切换场景时调用Resources.UnloadUnusedAssets四种 函数造成的,通常情形下其开销完整篇 后后会比较大。建议开发团队通过UWA性能检测,在加载模块中进一步定位卸载场景的元凶。

Q6:我有一一个多 多UI预设,它使用了一一个多 多图集, 我在打包的让你把图集和UI并肩打成了AssetBundle。我在加载生成了GameObject后立刻卸载了AssetBundle对象, 倘若当我上端再销毁GameObject的让你发现图集依然发生,这是那此情形呢?

Q1:将Shader独立打包,肯能我在启动游戏的让你加载一次,这么让你切换场景是完整篇 后后就不用每次都加载了?

Loading.ReadObject是Unity引擎的资源加载函数,一般一一个多劲跳出在切换场景和加载API调用时,这其中包括纹理、网格、Material、Shader、AnimationClip等资源。肯能你发现该值严重不足,建议去大力优化加载的相关资源。对于每项资源的加载,亲戚亲戚朋友正在以专题的土措施进行总结和分享,建议亲戚亲戚朋友还需用先查看以下内容:

加载模块之纹理

加载模块之网格

加载模块之Shader

加载模块之动画片段

Q3:我用UGUI做的一一个多 多界面饱含一一个多 多背景图片,游戏中这么做任何解决,关闭销毁四种 界面后四种 图片还在内存中,倘若我肯能调用过了Resources.UnloadUnusedAssets,如下图所示。我的预设这么打成AssetBundle,是放到Resource路径加载的。请问是那此由于 由于 的呢?



是的,Resources.UnloadUnusedAssets同样还需用卸载由AssetBundle.Load加载的资源,所以 前提是其对应的AssetBundle肯能调用Unload(false),且并这么被引用。

Q5:我使用Shader.WarmupAllShaders操作,在后续加载资源还是有CreateGPUProgram一一个多劲跳出。(Shader完整篇 后后一一个多 多AssetBundle文件中,完整篇 后后常驻内存的,不用删掉)是需用使用ShaderVariantCollection来加载Shader吗?

在使用 Resources.Load 加载 UI 界面的情形下,即使“关闭销毁四种 界面”后,Resources.UnloadUnusedAssets 确实还是无法卸载对应的图集的。肯能此时该图集依然被 Resources.Load 加载出来的 Prefab 引用。

对于四种 情形,亲戚亲戚朋友的建议是手动调用 Resources.UnloadAssets 来手动释放图集(还需用通过 Sprite.texture 来找到对应的图集),在重新实例化该 UI 界面时,图集也会自动进行 Reload 的。

Q7:肯能先Destroy Prefab ,倘若将Prefab中用到的AssetBundle再进行Unload,所以 的顺序与非 会有问题图片 ? 我在手机上测试时发现所以 做内存中就会一一个多劲发生,不释放;肯能反过来, 就还需用释放。另外,我是在Destroy 的让你调用的Resources.UnloadUnusedAssets();,请问这会影响最终的结果吗?

从点击应用到首次一一个多劲跳出应用画面,其加载时间主要与两方面相关:

1、Resources文件夹中的资源数量。在游戏启动时,Unity引擎会为Resources文件夹下的资源建立一一个多 多查找树来存放与其对应的索引,便于后续资源的加载。一般来说,Resouces文件夹下资源数量越多,其构建时间越长,应用的启动也就越慢;

2、首场景的资源加载和相关代码的初始化工作。肯能首场景的资源量较多,其脚本初始化的任务较重,则应用的启动时间也会越慢。



原文出处:侑虎科技

本文作者:admin

转载请与作者联系,并肩请务必标明文章原始出处和原文链接及本声明。

Instantiate的卡顿与三每项开销相关:相关资源加载、脚本组件的序列化和构造函数的执行,倘若绝大每项由于 均是相关资源加载由于 。所以 ,亲戚亲戚朋友的建议如下:

1、通过 Profiler 查看 Instantiate 具体的CPU分配情形;

2、肯能是资源加载由于 的性能瓶颈,则一方面通过复杂性资源来缓解CPU耗时压力,本人面通过 AssetBundle 依赖关系打包将资源预先加载,即将此处 Instantiate 的总体耗时拆分,平摊到让你帧进行执行(比如切换场景处等),从而让 Instantiate 实例化操作的局部耗时更加平滑;

3、肯能是脚本组件序列化由于 的性能瓶颈,则可尝试减少脚本中的序列化信息;

4、肯能是构造函数的执行由于 的性能瓶颈,一般不能在策略上进行规避,比如降低 Instantiate 的调用频率等。

针对资源加载每项,亲戚亲戚朋友近期正以专题的形式连载中,后续会对其Instantiate实例化的调用进行更为完整篇 的分析,敬请期待。

加载模块之纹理

加载模块之网格

加载模块之Shader

加载模块之动画片段

确实肯能发生四种 情形,在 Resources.UnloadUnusedAssets(); 时,肯能还这么进行AssetBunlde的Unload 操作,这么从AssetBunlde中加载的资源依然会肯能被AssetBunlde引用而无法被卸载。 开发团队还需用尝试 Destory 后做 AssetBunlde的Unload,最后进行 Resources.UnloadUnusedAssets(); 。

对于Unity 5.3版本让你的项目,还需用从AssetBundle打包四种 进行解决。即:使用LZ4格式的AssetBundle文件,而不使用默认的LZMA格式。同样还需用达到上述的需求,稍有严重不足的是,LZ4格式的AssetBundle文件较之LZMA格式的文件占用稍大。

这是Unity引擎最主要的加载函数。该项一般在切换场景时或主动动态加载资源时较大。 一般来说,加载资源越多、越复杂性,则其反映的Loading.UpdatePreloading耗时则越大。

优化让你,需用先定位该函数的CPU占用瓶颈。下图则为亲戚亲戚朋友的案例项目,Loading.UpdatePreloading函数在UWA测评报告中的总体CPU分配情形。通过四种 堆栈信息,开发团队就还需用对函数的耗六时配一目了然,从而有的放矢地进行优化。

Q2:从点击应用到一一个多劲跳出游戏画面,四种 时间长短是完整篇 后后和Resource目录大小有关系?

Resources.UnloadAsset仅能释放非GameObject和Component的资源,比如Texture、Mesh等真正的资源。对于由Prefab加载出来的Object或Component,则不能通过该函数来进行释放。

Q1:切换场景时,卸载上一一个多 多场景总感觉耗时,请问亲戚亲戚朋友与非 有那此推荐的方案?

这四种 土措施的具体区别可先参考《你应该知道的AssetBundle管理机制》中的“AssetBundle加载进阶”每项。

目前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 上。

Q6:亲戚亲戚朋友在UWA上进行了性能测试,发现安卓上同步加载AssetBundle资源会非常耗CPU, 所以 近期对资源加载土措施做了比较大的调整,绝大每项的资源使用异步加载的形式。 不过这里有个问题图片想咨询下: AssetBundle.LoadAsync 和 WWW加载土措施都还需用用来异步加载AssetBundle, 倘若两者API特点所以 同, 目前看WWW更耗内存或多或少, 请问这四种 土措施更建议使用哪四种 ?

这是很肯能一一个多劲跳出的。unload(false)卸载AssetBundle并不一定会销毁其加载的资源 ,是需用调用 Resources.UnloadUnusedAssets才行。关于AssetBundle加载的完整篇 解释还需用参考亲戚亲戚朋友让你的文章:你应该知道的AssetBundle管理机制。

Q5:我在Profiler中看一遍 GC.MarkDependencies 的CPU消耗有900ms+, 确实在退出战斗的让你调用了Resources.UnloadUnusedAssets(); 所以 卡顿还是很明显,请问有那此推荐的方案吗?

GC.MarkDependencies的消耗是由Resources.UnloadUnusedAssets引起的。该函数的主要作用是查找并卸载不再使用的资源。游戏场景越复杂性、资源越多,该函数的开销越大,一般在400~4000 ms范围内。所以 ,亲戚亲戚朋友在UWA报告中加入了对该函数的调用监测,以便让亲戚亲戚朋友更好地掌控它的调用情形。



对于该函数的优化,亲戚亲戚朋友建议一方面控制场景中并不一定要的资源量,并肩通过UnloadAsset来及时卸载不再使用的资源,以减少Resources.UnloadUnusedAssets的耗时压力。

后续,亲戚亲戚朋友会在加载模块的相关文章中为亲戚亲戚朋友完整篇 讲解Resources.UnloadUnusedAssets的性能问题图片,敬请期待。

确切地说,要达到后续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时,与非 会出问题图片?

建议开发团队使用UWA的资源检测工具,检测下AssetBundle中Shader的具体打包情形,查看与非 一一个多劲跳出了冗余打包的问题图片。

AssetBundle.LoadAsync 是在获取了 AssetBundle 对象让你加载其中的资源的;而 WWW 加载是在获取 AssetBundle,两者的作用是不同的。

开发者肯能是希望了解异步加载 AssetBundle 的几只 API 之间的区别,相关的接口如下:

Q4:关于Loading.ReadObject耗费比较高,有那此推荐的土措施吗?

Q1:现在Unity还不能将场景和 NavMesh数据肯能Lightmap数据分离,是吗?我是想先加载一一个多 多干净的场景,倘若再动态切入不同的光照贴图和NavMesh网格数据,有那此土措施吗?

对于Unity 5.3版本让你的项目,建议通过LoadFromCacheOrDownload或LoadFromFile的土措施来加载AssetBundle,所以 既还需用降低Assetbundle对象的内存占用,又还需用保持AssetBundle与资源之间的链接关系,从而方便后续具有依赖关系的Prefab的加载。

Q2:Resources.UnloadUnusedAssets() 不仅局限于Resources.Load的资源,还包括AssetBundle.Load的资源,是吗?