刘泰言创建于 1 年前

在使用异步接口 yield return AssetBundle.ASyncLoad的时候,难免会想到:这个异步处理完之前如何Cancel掉这个任务?
也就是一个AssetBundle加载到一半,现在要放弃加载,应该怎么处理?

赞同 0评论 分享
10条回复
曾毅回答于 1 年前

无法CANCEL

赞同 1评论 分享
Walker回答于 1 年前

Unity的接口里没有中断操作,但是可以在自己项目的ABMgr模块给业务逻辑层提供一个可中断的接口。也就是Mgr里加载好资源后,如果业务层不需要了,则不返回/不执行回调。至于这个“不需要”的资源是要缓存,还是卸载就得根据自己项目来了。

赞同 1评论 分享
贾伟昊回答于 1 年前

分享一个小的Unity文档上的坑吧,其实我也不知道答案,可能希望有源码的朋友帮忙看看。
在异步请求一个AssetBundle的时候,会返回一个AssetBundleCreateRequest对象,Unity的官方文档上写AssetBundleCreateRequest.assetBundle的时候这样说:

Description
Asset object being loaded (Read Only).

Note that accessing asset before isDone is true will stall the loading process.

用了Stall这样一个词,我们之前理解Stall是停止的意思,以为这个接口的调用可以将异步请求打断,所以借助这个特性应用在“同一个AssetBundle正在被异步加载的过程中来了一个同步请求”这样的情况下。
今天看到这个问题,又读了读这个文档,感觉Stall这个词并不是停止的意思,而更可能是“拖延”的意思。如果是一个异步加载请求,那么是在另外的线程里执行的,这时候如果有主线程的访问请求的话,应该会有跨线程的加锁逻辑,从而可能导致加载变得更慢。如果是停止的话,我觉得文档应该使用Stop这样更加明确的单词……

当然这个是我个人的猜测,并不一定真的是这样。。。如果有其他朋友知道准确的意思也烦请告知~

赞同 1评论 2 分享
  • K

    kent

    会有一个资源锁,体现在Loading.LickPersistentManager,这时要控制依赖关系及同一时刻提取asset的数量。

    1 年前
  •  

    贾伟昊回复kent

    感谢回复~

    1 年前
 

评论

S
silekey回答于 1 年前

碰到的问题和我一样呢, 最后我们是使用promise方式封装了资源加载的接口。
返回的handle对象状态一旦凝固就不会再改变.

////code1
op = loadasset()
yield return op
if op.error != nil then
log("fail=" + op.error)
end ////code2
op:reject("next scene is loading")
赞同 2评论 分享
lichun回答于 1 年前

看到贾伟昊说到的这个问题,很激动地去看了一下API和UnityReferenceSource。由于项目一直在用5.6版本,2017和2018的AB这块还没测试过。5.6是肯定不能取消或者block获取到AB资源的,看新的Doc里面都提到了能block获取到资源,referenceSource中AB的API也提到了,asset的API中没有提到。理解应该是在异步没有完成之前,访问资源可以变成同步马上获取到该资源,有测试过的同学可以回答一下。如果真是这样,那就太好了,相信很多项目的设计上都是同步与异步并存的,只是绕过了同步加载一个正在异步加载资源的问题。Unity如果这块修改了,就可以完美解决同步加载一个正在异步加载资源的问题了。

鉴于Unity Doc被坑过几次,更相信ReferenceSource里的,猜测AB也许实现了同步访问正在异步加载的资源,asset没有实现。

赞同 3评论 2 分享
  •  

    灰灰

    2017也是,异步没完成前直接访问asset会同步完成加载

    1 年前
  • L

    leeman回复灰灰

    有具体例子可以看一下怎么实现吗?现在也再纠结这个东西

    1 年前
 

评论

C
C.Y回答于 1 年前

我们之前的项目,无论是同步加载还是异步加载,都是以异步的方式写代码,就是为了解决这种不确定性

赞同 0评论 分享
灰灰回答于 1 年前

没法取消异步加载操作,但是通过在isDone之前直接访问Asset可以同步加载完成资源,也算中止异步加载操作吧。

赞同 0评论 分享
C
cloud回答于 1 年前

先异步加载1.ab,异步未完成时,直接同步加载该1.ab。
此时会有类似的error:The asset bundle ‘’ can’t be loaded because another asset bundle with the same files are already loaded。直接忽略该错误即可。

赞同 0评论 2 分享
  • 直接忽略?难道是已经加载成功了?报错不准?

    1 年前
  • 官方说是保护性的提示,无任何副作用。

    1 年前
 

评论

L
leeman回答于 1 年前

同一帧相同资源先调异步再调同步办法
上面说的比较原理。我来直接上代码吧。造福大家
abrequest = AssetBundle.LoadFromFileAsync(path)
abrequest .assetBundle.Unload(false)
ab = AssetBundle.LoadFromFile(path)
这样会直接同步回来ab,但是会破坏原来异步的回调值 里面abreast.assetbundle 会变空不太好。
还有一种办法是最后一句改为
asset a =abrequest.assetBundle.asset
这样原来异步的回调可以正常执行,同步也可以直接返回值。是一个比较好的解决方案。原来代码的逻辑改动小。

赞同 2评论 2 分享
  • 赞一个,方案可行

    1 年前
  • X

    xp

    没看懂

    1 年前
 

评论

Z
zblade回答于 1 年前

在Unity2018.1.1f上测试了,可以通过获取bundle的操作来打断异步操作,使其改为同步加载。具体示例代码:

        AssetBundleCreateRequest abRequest = AssetBundle.LoadFromFileAsync(path);
abRequest.assetBundle.Unload(true);
AssetBundle ab = abRequest.assetBundle;
if (ab == null)
{
ab = AssetBundle.LoadFromFile(path);
var assets = ab.LoadAllAssets();
foreach (var item in assets)
{
Debug.Log(item.name);
}
}
else
{
var assets = ab.LoadAllAssets();
foreach(var item in assets)
{
Debug.Log(item.name);
}
}

如果执行Unload(true), 那么这一行代码的本质是将异步改为同步,然后加载该bundle,再释放该bundle,下面会执行LoadFromFile操作。如果注释掉该执行代码,则直接获取assetbundle的操作返回的是同步加载的bundle,会执行else语句块中的代码。
大家可以测试一下,我测试没有问题

AssetBundle异步加载被中断的问题的更多相关文章

  1. Unity+NGUI打造网络图片异步加载和本地缓存工具(一)

    我们已经开发了在移动终端中,异步网络图片被装入多,在unity其中尽管AssetBundle存在,通常第一个好游戏的资源,然后加载到现场,但也有很多地方可以使用异步网络加载图像以及其缓存机制. 我也写 ...

  2. 详谈 Unity3D AssetBundle 资源加载,结合实际项目开发实例

    第一次搞资源更新方面,这里只说更新,加载,AssetBundle资源加载,谈谈自己的理解,以及自己在项目中遇到的那些神坑,现在回想一下,真的是自己跪着过来的,说多了,都是泪. 我这边是安卓AssetB ...

  3. UNITY所谓的异步加载几乎全部是协程,不是线程;MAP3加载时解压非常慢

    实践证明,以下东西都是协程,并非线程(thread): 1,WWW 2,AssetBundle.LoadFromFileAsync 3,LoadSceneAsync 其它未经测试 此问题的提出是由于一 ...

  4. js如何使浏览器允许脚本异步加载

    js如何使浏览器允许脚本异步加载 如果脚本体积很大,下载和执行的时间就会很长,因此造成浏览器堵塞,用户会感觉到浏览器“卡死”了,没有任何响应.这显然是很不好的体验,所以浏览器允许脚本异步加载,下面就是 ...

  5. 关于ios异步加载图片的几个开源项目

    一.HjCache  原文:http://www.markj.net/hjcache-iphone-image-cache/ 获取 HJCache: HJCache is up on github h ...

  6. QFramework 使用指南 2020(九):Res Kit(3)异步加载 与 异步队列加载

    在上一篇我们了解了 Res Kit 的一些背后设计原理,讲解了一些概念,比如:开发阶段.真机阶段等. 在这一篇,我们回到 Res Kit 使用细节上. 在 Res Kit 的第一篇,我们介绍了 Res ...

  7. winform异步加载数据到界面

    做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...

  8. 【Android】纯代码创建页面布局(含异步加载图片)

    开发环境:macOS 10.12 + Android Studio 2.2,MinSDK Android 5.1 先看看总体效果 本示例是基于Fragment进行的,直接上代码: [界面结构] 在 F ...

  9. 【代码笔记】iOS-实现网络图片的异步加载和缓存

    代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. se ...

随机推荐

  1. 自定义TabLayout的Indicator

    最近项目要使用类似TabLayout的控件,其实我感觉就是TabLayout只是换了一个Indicator,先说一说TabLayout这是Android Support Design的控件要使用的同学 ...

  2. jenkins构建项目时报错缺少com.sun.image.codec.jpeg包解决方案

    错误日志:error: package com.sun.image.codec.jpeg does not exist 网上找的一个项目,使用的是jdk1.7,除此之外其他服务器配置或是环境配置都是j ...

  3. Yii2 前后台登陆退出分离、登陆验证

    这里用的yii2高级模板, 基本模板的配置文件在一个文件里,方法基本没什么区别, 1.用户表要有两个用户表, 当然一个也行,分开是省得麻烦,既然是分离了就彻底分开, 前台表user,后台表user_b ...

  4. python openpyxl内存不主动释放 ——关闭Excel工作簿后内存依旧(MemoryError)

    在openpyxl对Excel读写操作过程中,发现内存没有马上释放,如果得多次读取大文件,内存爪机,后续代码就无法运行. 尝试:各种wb.save()或者with open等途径无法解决. 发现:因为 ...

  5. IDEA统一注释格式(干货)

    统一注释格式: Idea自动生成注释: /** *@author 你的名字的简写 *@date ${DATE}${TIME} 在每个功能上添加注释,例子如下: 我在Mapper文件中添加了自己书写的S ...

  6. KafkaStream低级别API

    开发者可以通过Processor接口来实现自己的自定义处理逻辑.接口提供了Process和Punctuate方法. 其中:Process方法用于处理接受到的消息 Punctuate方法指定时间间隔周期 ...

  7. 窥见云技术未来大势,腾讯云Techo开发者大会即将在京召开

    云.物联网.5G.人工智能……一项项技术的突破带来了天翻地覆的变化,开发者们是如何一次次地进行天马行空的创意和极限突破?2019年11月6日-7日,由腾讯云主办的首届Techo开发者大会将在北京嘉里大 ...

  8. 帝国cms网站管理系统之安全设置最优化分享

    首先我们来认识一下帝国CMS安全认证特性:帝国登录四重安全验证:第一重:密码双重MD5加密,密码不可破解,假如数据库被下载,也无法获取真实密码.第二重:后台目录自定义,假如对方知道密码也找不到登录后台 ...

  9. Web前端安全之利用Flash进行csrf攻击

    整理于<XSS跨站脚本攻击剖析与防御>—第6章 Flash在客户端提供了两个控制属性: allowScriptAccess属性和allowNetworking属性,其中AllowScrip ...

  10. Ubuntu16.04换源

    换成国内最快的阿里云源 第一步:备份原来的源文件 cd /etc/apt/ 然后会显示下面的源文件sources.list 输入命令 sudo cp sources.list sources.list ...