设为首页收藏本站

微软Hololens全息现实网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

一键登录:

查看: 542|回复: 1

Unity之AssetBundles低级API探究(二)难度: 高级

[复制链接]
发表于 2017-3-5 18:05:09 | 显示全部楼层 |阅读模式

2.1 管理已加载的资产 在内存敏感环境中仔细控制加载对象的大小和数量是非常关键的。当它们从活动场景中删除时,Unity不会自动卸载对象。资产清理在特定时间触发,也可以手动触发。 AssetBundles自己必须仔细管理。由本地存储上的文件(在Unity缓存中或通过AssetBundle.LoadFromFile加载的文...



2.1 管理已加载的资产

在内存敏感环境中仔细控制加载对象的大小和数量是非常关键的。当它们从活动场景中删除时,Unity不会自动卸载对象。资产清理在特定时间触发,也可以手动触发。



AssetBundles自己必须仔细管理。由本地存储上的文件(在Unity缓存中或通过AssetBundle.LoadFromFile加载的文件)支持的AssetBundle具有最小的内存开销,很少超过10-40千字节。当存在大量AssetBundle时,这种开销仍然可能成为问题。



由于大多数项目允许用户重新体验内容(例如重放级别),因此了解何时加载或卸载AssetBundle非常重要。如果AssetBundle卸载不正确,它可能导致内存中的对象重复。不正确地卸载AssetBundles还可能导致在某些情况下不希望的行为,例如导致纹理丢失。要理解为什么会发生这种情况,请参阅资产,对象和序列化章节的对象间引用部分。



在管理资产和AssetBundles时,最重要的是理解当调用带有true或false参数的AssetBundle.Unload时的行为差异。



此API卸载正在调用的AssetBundle的头信息。参数指示是否还卸载从此AssetBundle实例化的所有对象。如果为真,则源自AssetBundle的所有对象也将被立即卸载 - 即使它们当前正在活动场景中使用。



例如,假设材料M从AssetBundle AB加载,并且假设M当前在活动场景中。



ab2a.jpg


如果调用AB.Unload(true),那么M将从场景中删除,销毁和卸载。 然而,如果调用AB.Unload(false),那么AB的头信息将被卸载,但M将保留在场景中,并且仍将起作用。 调用AssetBundle.Unload(false)断开M和AB之间的链接。 如果稍后再次加载AB,则AB中包含的对象的新副本将被加载到内存中。



ab2b.jpg



如果稍后再次加载AB,则将重新加载AssetBundle头信息的新副本。 然而,M没有从这个新的AB副本加载。 Unity不在AB和M的新副本之间建立任何链接。





ab2c.jpg




如果调用AB.LoadAsset()重新加载M,Unity不会将M的旧副本解释为AB中的数据的实例。 因此,Unity将加载M的新副本,并且场景中将有两个相同的M副本。

ab2d.jpg




对于大多数项目,这种行为是不可取的。大多数项目应该使用AssetBundle.Unload(true)并采用一种方法来确保对象不会重复。两种常见的方法是:


在应用程序的生命周期中,在临时AssetBundles卸载时,如在级别之间或在加载屏幕期间具有明确定义的点。这是更简单和最常见的选项。
维护单个对象的引用计数,并仅在其所有组成对象未使用时卸载AssetBundles。这允许应用程序卸载和重新加载单个对象,而不会复制内存。
如果应用程序必须使用AssetBundle.Unload(false),那么单个对象只能以两种方式卸载:



在场景和代码中消除对不需要的对象的所有引用。完成后,调用Resources.UnloadUnusedAssets。
非加法加载场景。这将销毁当前场景中的所有对象,并自动调用Resources.UnloadUnusedAssets。
如果项目有明确定义的点,用户可以等待对象加载和卸载,如在游戏模式或级别之间,这些点应该用于卸载尽可能多的对象,并加载新的对象。

最简单的方法是将一个项目的离散块封装到场景中,然后将这些场景与所有的依赖关系一起构建到AssetBundles中。然后应用程序可以进入“加载”场景,完全卸载包含旧场景的AssetBundle,然后加载包含新场景的AssetBundle。

虽然这是最简单的流程,但某些项目需要更复杂的AssetBundle管理。没有通用的AssetBundle设计模式。每个项目的数据不同。当决定如何将对象分组到AssetBundles时,通常最好先将对象捆绑到AssetBundles中,如果它们必须同时加载或更新。

例如,考虑角色扮演游戏。单个地图和过场动画可以按场景分组成AssetBundles,但在大多数场景中将需要一些对象。 AssetBundles可以构建来提供肖像,游戏中的UI,以及不同的字符模型和纹理。这些后面的对象和资产然后可以被分组成在启动时加载并且在应用程序的生命周期保持加载的第二组AssetBundles。

如果在AssetBundle被卸载后Unity必须从它的AssetBundle重新加载一个对象,则会出现另一个问题。在这种情况下,重新加载将失败,对象将作为(缺少)对象出现在Unity编辑器的层次结构中。

这主要发生在当Unity失去并重新获得对其图形上下文的控制时,例如当移动应用被暂停或用户锁定其PC时。在这种情况下,Unity必须重新上传纹理和着色器到GPU。如果这些资源的源AssetBundle不可用,应用程序将在“缺少着色器”洋红色的场景中渲染对象。


2.2 分发(Distribution

有两种基本方法将项目的AssetBundles分发给客户端:与项目同时安装或在安装后下载它们。 是否在安装期间或之后运送AssetBundles的决定由项目将运行的平台的能力和限制驱动。 移动项目通常选择安装后下载,以减少初始安装大小,并保持低于无线下载大小限制。 控制台和PC项目通常将AssetBundles与其初始安装一起运送。



正确的架构允许在安装后将新的或修改的内容打包到项目中,无论AssetBundles最初是如何交付的。 有关此的详细信息,请参阅本文的“使用AssetBundles修补”部分。




2.2.1.Shipped with project

运输AssetBundles与项目是发布它们的最简单的方法,因为它不需要额外的下载管理代码。 有一个项目可能包括AssetBundles与安装有两个主要原因:


  • 减少项目构建时间并允许更简单的迭代开发。 如果这些AssetBundles不需要与应用程序本身分开更新,那么通过将AssetBundles存储在Streaming Assets中,可以将AssetBundles包含在应用程序中。 请参阅下面的“流式传输资产”部分。




  • 发送可更新内容的初始版本。 这通常用于在最初安装之后保存最终用户时间,或者用作稍后修补的基础。 流式资产对于这种情况不是理想的。 但是,如果编写自定义下载和缓存系统不是一个选项,则可更新内容的初始修订可以从流式资产加载到Unity缓存中。




2.2.1.1. Streaming Assets

在安装时在Unity应用程序中包括任何类型的内容的最简单的方法是在构建项目之前将内容构建到/ Assets / StreamingAssets /文件夹中。构建时StreamingAssets文件夹中包含的任何内容都将复制到最终应用程序中。此文件夹可用于存储最终应用程序中的任何类型的内容,而不仅仅是AssetBundles。



在运行时可以通过属性Application.streamingAssetsPath访问本地存储上StreamingAssets文件夹的完整路径。然后可以通过AssetBundle.LoadFromFile在大多数平台上加载AssetBundles。



Android开发人员:在Android上,Application.streamingAssetsPath将指向一个压缩的.jar文件,即使AssetBundles是压缩的。在这种情况下,必须使用WWW.LoadFromCacheOrDownload加载每个AssetBundle。还可以编写自定义代码以解压缩.jar文件,并将AssetBundle提取到本地存储上的可读位置。



注意:在某些平台上,流式资产不是可写位置。如果项目的AssetBundles需要在安装后更新,请使用WWW.LoadFromCacheOrDownload或写一个自定义下载程序。





(未完待续。。。)


































上一篇:Unity之AssetBundles低级API探究(一)难度: 高级
下一篇:Discounts! Mecool bb2 pro android 6.0 tv box 3gb ddr4 + 16gb-87.86 $
发表于 2017-5-3 22:08:25 | 显示全部楼层
楼真辛苦辛苦,谢谢分享
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

注册验证邮件查收提醒:

由于各大邮箱政策原因,

如果没收到邮件提醒,

您的注册验证邮件可能

被投送到您邮箱的垃圾箱,

请注意查收验证哦


QQ|小黑屋|Hololens全息现实网 ( 京ICP备15026232号   点击这里给我发消息

GMT+8, 2018-1-17 01:28 , Processed in 0.557706 second(s), 30 queries .

Powered by Hololens全息现实网 X3.2

© 2001-2017 Hololens全息现实网

快速回复 返回顶部 返回列表