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

  • 时间:
  • 浏览:1
  • 来源:大发5分3DAPP下载_大发5分3DAPP官方

Q5:我在Profiler中就看 GC.MarkDependencies 的CPU消耗有900ms+, 其人太好退出战斗的后后调用了Resources.UnloadUnusedAssets(); 有二个卡顿还是很明显,请问有并且推荐的方案吗?

Instantiate的卡顿与三偏离 开销相关:相关资源加载、脚本组件的序列化和构造函数的执行,而且绝大偏离 愿因均是相关资源加载愿因。并且,我们我们我们我们我们我们 的建议如下:

1、通过 Profiler 查看 Instantiate 具体的CPU分配状况;

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

3、将会是脚本组件序列化愿因的性能瓶颈,则可尝试减少脚本中的序列化信息;

4、将会是构造函数的执行愿因的性能瓶颈,一般必须在策略上进行规避,比如降低 Instantiate 的调用频率等。

针对资源加载偏离 ,我们我们我们我们我们我们 近期正以专题的形式连载中,后续会对其Instantiate实例化的调用进行更为全版的分析,敬请期待。

加载模块之纹理

加载模块之网格

加载模块之Shader

加载模块之动画片段

Q3:我用UGUI做的有二个界面涵盖二个背景图片,游戏中必须做任何避免,关闭销毁并且界面后并且图片还在内存中,而且我将会调用过了Resources.UnloadUnusedAssets,如下图所示。我的预设必须打成AssetBundle,是中放Resource路径加载的。请问是并且愿因愿因的呢?



是的,Resources.UnloadUnusedAssets同样都才能卸载由AssetBundle.Load加载的资源,并且前提是其对应的AssetBundle将会调用Unload(false),且并必须被引用。

GC.MarkDependencies的消耗是由Resources.UnloadUnusedAssets引起的。该函数的主要作用是查找并卸载不再使用的资源。游戏场景越复杂化、资源必须多,该函数的开销越大,一般在150~1150 ms范围内。并且,我们我们我们我们我们我们 在UWA报告中加入了对该函数的调用监测,以便我就们更好地掌控它的调用状况。



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

后续,我们我们我们我们我们我们 会在加载模块的相关文章中为我们我们我们我们我们我们 全版讲解Resources.UnloadUnusedAssets的性能难题,敬请期待。

Q4:要怎样动态加载Navmesh?

Q3:请问并且Loading.UpdatePreloading是并且东西,为也我太大 突然必须高?一般状况下有必须并且优化的土依据?

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

Q6:我们我们我们我们我们我们 在UWA上进行了性能测试,发现安卓上同步加载AssetBundle资源会非常耗CPU, 并且近期对资源加载土依据做了比较大的调整,绝大偏离 的资源使用异步加载的形式。 不过这里有个难题想咨询下: AssetBundle.LoadAsync 和 WWW加载土依据都都才能用来异步加载AssetBundle, 而且两者API特点并且同, 目前看WWW更耗内存并且, 请问并且种生活土依据更建议使用哪一种 ?

Loading.ReadObject是Unity引擎的资源加载函数,一般出現在切换场景和加载API调用时,这其中包括纹理、网格、Material、Shader、AnimationClip等资源。将会你发现该值不足英文,建议去大力优化加载的相关资源。对于偏离 资源的加载,我们我们我们我们我们我们 正在以专题的土依据进行总结和分享,建议我们我们我们我们我们我们 都才能先查看以下内容:

加载模块之纹理

加载模块之网格

加载模块之Shader

加载模块之动画片段

Q1:将Shader独立打包,将会我在启动游戏的后后加载一次,必须后后切换场景是全版都是就我太大 每次都加载了?

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.请问该要怎样避免?

建议开发团队使用UWA的资源检测工具,检测下AssetBundle中Shader的具体打包状况,查看否有有出現了冗余打包的难题。

这是Unity在切换场景时调用Resources.UnloadUnusedAssets并且函数造成的,通常状况下其开销全版都是会比较大。建议开发团队通过UWA性能检测,在加载模块中进一步定位卸载场景的元凶。

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

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

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

并且种生活土依据的具体区别可先参考《你应该知道的AssetBundle管理机制》中的“AssetBundle加载进阶”偏离 。

人太好将会位于并且状况,在 Resources.UnloadUnusedAssets(); 时,将会还必须进行AssetBunlde的Unload 操作,必须从AssetBunlde中加载的资源依然会将会被AssetBunlde引用而无法被卸载。 开发团队都才能尝试 Destory 后做 AssetBunlde的Unload,最后进行 Resources.UnloadUnusedAssets(); 。

Q1:现在Unity还必须将场景和 NavMesh数据将会Lightmap数据分离,是吗?我是想先加载有二个干净的场景,而且再动态切入不同的光照贴图和NavMesh网格数据,有并且土依据吗?

Q6:我有二个UI预设,它使用了有二个图集, 我在打包的后后把图集和UI同去打成了AssetBundle。我在加载生成了GameObject后立刻卸载了AssetBundle对象, 而且当我后面 再销毁GameObject的后后发现图集依然位于,这是并且状况呢?

Q5:同有二个纹理,有多个Prefab生成的实例,会有多份并且纹理的copy吗?

Q7:将会先Destroy Prefab ,而且将Prefab中用到的AssetBundle再进行Unload,有二个的顺序否有有会有难题 ? 我在手机上测试时发现有二个做内存中就会突然位于,不释放;将会反过来, 就都才能释放。另外,我是在Destroy 的后后调用的Resources.UnloadUnusedAssets();,请问这会影响最终的结果吗?

在使用 Resources.Load 加载 UI 界面的状况下,即使“关闭销毁并且界面”后,Resources.UnloadUnusedAssets 人太好还是无法卸载对应的图集的。将会此时该图集依然被 Resources.Load 加载出来的 Prefab 引用。

对于并且状况,我们我们我们我们我们我们 的建议是手动调用 Resources.UnloadAssets 来手动释放图集(都才能通过 Sprite.texture 来找到对应的图集),在重新实例化该 UI 界面时,图集也会自动进行 Reload 的。



原文出处:侑虎科技

本文作者:admin

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

确切地说,要达到后续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时,否有有会出难题?

这是很将会出現的。unload(false)卸载AssetBundle并非 会销毁其加载的资源 ,是才能 调用 Resources.UnloadUnusedAssets才行。关于AssetBundle加载的全版解释都才能参考我们我们我们我们我们我们 后后的文章:你应该知道的AssetBundle管理机制。

Q4:关于Loading.ReadObject耗费比较高,有并且推荐的土依据吗?

Q5:我使用Shader.WarmupAllShaders操作,在后续加载资源还是有CreateGPUProgram出現。(Shader全版都是有二个AssetBundle文件中,全版都是常驻内存的,我太大 删掉)是才能 使用ShaderVariantCollection来加载Shader吗?

对于Unity 5.3版本后后的项目,建议通过LoadFromCacheOrDownload或LoadFromFile的土依据来加载AssetBundle,有二个既都才能降低Assetbundle对象的内存占用,又都才能保持AssetBundle与资源之间的链接关系,从而方便后续具有依赖关系的Prefab的加载。

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

该难题才能 查看 Prefab 的具体加载土依据。将会仅是通过 Resources.Load 进行加载,必须纹理是我太大 位于多份的,但将会是通过AssetBundle加载,每个 Prefab 均为有二个 AssetBundle 且纹理必须进行依赖关系打包励志的话 ,必须纹理资源人太好会在内存中位于多份。将会你发现了内存中位于多份相同纹理,且是通过 AssetBundle 文件来加载资源的,则建议将 AssetBundle 上传到UWA网站(www.uwa4d.com)中,其资源检测工具能协助开发团队高效检测并定位AssetBundle中的冗余资源。

以上并且难题的较大将会是:Shader被打包到不同AssetBundle中了,WarmupAllShaders仅能对当前内存中的Shader进行warm up。后续将会又有Shader加载进来,则仍然会出現CreateGPUProgram操作。

Lightmap是都才能与场景分离的,而且都才能通过AssetBundle进行动态加载。建议将Lightmap作为普通的资源进行打包,动态加载后,通过LightmapSetting接口整体替换场景的Lightmap。目前,Navmesh人太好是无法与场景分离的。而且在Unity 5.x版本后后,引擎将会允许通过LoadLevelAdditive加载多个场景的土依据来加载NavMesh,而且,研发团队都才能尝试预先将NavMesh在多个场景内烘焙好,而且通过LoadLevelAddtive或同类API来进行加载,从而达到动态加载NavMesh的效果。

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

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

将会是依赖关系打包,对于被依赖的共享资源AssetBundle文件,我们我们我们我们我们我们 还是建议将其缓位于内存中,虽有一定的内存增加,但都才能通过上述土依据极大地降低内存上的占用,缓解内存压力。

Q1:切换场景时,卸载上有二个场景总感觉耗时,请问我们我们我们我们我们我们 否有有有并且推荐的方案?

Q3:AssetBundle在使用时解压出来的资源会占用一定的内存。我们我们我们我们我们我们 现在想尝试使用一种加载土依据:(1)在AssetBundle加载相关的资源后,将资源进行缓存,并卸载AssetBundle文件;(2)对AssetBundle文件进行缓存,后后用到相关资源后再进行直接进行加载。请问并且种生活土依据我们我们我们我们我们我们 推荐哪一种比较好?

对于Unity 5.3版本后后的项目,都才能从AssetBundle打包一种进行避免。即:使用LZ4格式的AssetBundle文件,而不使用默认的LZMA格式。同样都才能达到上述的需求,稍有不足英文的是,LZ4格式的AssetBundle文件较之LZMA格式的文件占用稍大。

Q2:从点击应用到出現游戏画面,并且时间长短是全版都是和Resource目录大小有关系?

是的,不仅是Panel和Atlas,只并且A或B依赖于C,就才能 保证在加载或实例化A或B时,C的AssetBundle一定位于于内存中。将会后后将C对应的AssetBundle进行卸载,则加载或实例化A和B时,引擎将无法自动将C绑定给A和B进行使用。

关于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 上。

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

优化后后,才能 先定位该函数的CPU占用瓶颈。下图则为我们我们我们我们我们我们 的案例项目,Loading.UpdatePreloading函数在UWA测评报告中的总体CPU分配状况。通过并且堆栈信息,开发团队就都才能对函数的耗八时 配一目了然,从而有的放矢地进行优化。

Q1:我在第一次执行GameObject.Instantiate并且资源的后后会卡(当时加载当时就实例的状况),有的复杂化资源甚至在第一次GameObject.Instantiate的后后会卡70多毫秒,造成明显的卡顿,请问有并且好的避免方案吗?