using?System.Collections;
using?UnityEngine.UI;
using?UnityEngine.SceneManagement;
///?
///?挂载到camera上??异步加载
///?
public?class?ARLoadingScr?:?MonoBehaviour
{
///?
///?滑动条提交回答
///?
public?Slider?processBar;
private?AsyncOperation?async;
private?int?nowProcess;
void?Start()
{
StartCoroutine(loadScene());
}
///?
///?加载完场景后就会跳转??
///?
///?
IEnumerator?loadScene()
{
async?=?SceneManager.LoadSceneAsync("AR");
async.allowSceneActivation?=?false;
yield?return?async;
}
void?Update()
{
if?(async?==?null)
{
return;
}
int?toProcess;
//?async.progress?你正在读取的场景的进度值??0---0.9????
//?如果当前的进度小于0.9,说明它还没有加载完成,就说明进度条还需要移动????
//?如果,场景的数据加载完毕,async.progress?的值就会等于0.9??
if?(async.progress?0.9f) {="" toprocess?="?(int)async.progress?*?100;" }="" else="" {="" toprocess?="?100;" }="" ?如果滑动条的当前进度,小于,当前加载场景的方法返回的进度???="">?0.9f)>?toprocess)>
最近也在纠缠这些东西
unity在这方面比较黑箱 有时候很困惑
比较特殊的就是这个destroy.
destroy一个asset的实例是可以的,但是如果destroy一个asset就会把这个asset文件被摧毁。
对于prefab,这种差异很好区分,应该destroy那个instantiate出来的object
但是对于一些特殊的asset,这个差异就不那么好理解了。
比如贴图,一般很少显式的去instantiate创建实例,而是这样:
a.renderer.maintexture = assetbundle1.load("贴图1")
b.renderer.maintexture = assetbundle1.load("贴图1")
这种方法 其实是个引用 ,如果你destroy这个assetbundle1 那贴图1就没了 如果你destroy这个a或者b的maintexture,也是一样结果。
如果你
texture tex = instantiate( assetbundle1.load("贴图1")) as texture;
这个tex是可以被destroy的 要实例一个贴图 导入的地方要标志为readable。
如果你循环:
a.renderer.maintexture = assetbundle1.load("贴图2")
b.renderer.maintexture = assetbundle1.load("贴图2")
不停加载新贴图,之前创建的贴图就成了无引用的游离assets,会导致内存不断增加。解决办法 要么你自己记录每一次加载的对象,在不用的时候用resources.unloadasset(object)释放,简单的办法用一个resources.unloadunusedassets就能把这些没有指向的游离asset全部释放掉,但是很慢。
如果概念不太清楚的,destroy要慎用 除了prefab.
简单的说 load的东西释放应该用unload,instantiate的东西才用destroy,一一对应起来理论上就没有泄露。如果找不到当时那个load的对象了就简单的resources.unloadunusedassets。destroy一个asset等于删掉那个资源,奇怪官方论坛居然很多人建议destroy texture,洋人也不都是干货。
download.assetbundle.unload(true)这句一般就会unload这个assetbundle并且把关联的实例对象都清除。有这句理论上你不用destroy。
另外内存回收不是即时的 我试过跟踪,发现unity和mono的gc工作并不是很效率,和标准.net的gc有较大差距。之前曾经碰到过,连续load unload闪退的情况,后来发现gc没有及时生效,内存还是会突破限制,于是就在每个unload后跟了一个gc.collect()
另外现在www不需要显式的dispose,你看官方demo现在都不用这个了
如果你还有什么不懂的,可以百度搜下:编程回忆录,他们现在正在录制这方面的教程,都是零基础开始,由浅入深。