美文网首页
[FA] AB包卸载异步转同步测试

[FA] AB包卸载异步转同步测试

作者: _Walker__ | 来源:发表于2023-09-28 16:34 被阅读0次

1、环境

  • Unity 2021.3.21f1

2、结论

  • Unity2021无法实现;
  • Unity2022可以实现,新增的AssetBundleUnloadOperation,支持同步等待结束WaitForCompletion()

3、尝试强制阻塞主线程

  既然Unity自己没提供阻塞的接口,我就想是否可以强制把主线程阻塞住,等子线程执行完成后再恢复? 把问题抛给GPT,得到了一个没了解过的工具类,可以完成这个任务,下面介绍下用法。

AutoResetEvent block = new AutoResetEvent(false);
asyncOperation.completed += (ao =>
{
    block.Set();  // 异步操作完成后,恢复主线程
});
block.WaitOne(100000); // 阻塞当前(主)线程,超时时间10s

AutoResetEvent使用说明:

  • 当对象处于非信号状态(non-signaled)时,调用WaitOne()会阻塞当前线程。
    直到收到信号后,释放线程。
  • 构造方法参数
    传true:对象默认处于信号(signaled)状态,第一次调用WaitOne()便不会阻塞线程;
    传false:对象默认处于非信号状态,第一次调用WaitOne()会阻塞线程
  • Set()方法是给对象设置信号,如果有处于阻塞状态的对象,此时会释放线程
  • AutoResetEvent的对象,每次收到信号,释放阻塞线程后,都会把自己的状态重置,变成非信号状态,相当于自动调用了Reset()
  • AutoResetEvent相对应的,还有个ManualResetEvent类。它俩的区别只在于上面一条说的特性,ManualResetEvent不会再收到信号后,自动重置,需要手动调用Reset()才会将对象变为非信号状态。
经测试,此路不通!!!

  执行AsyncOperation asyncOperation = bundle.UnloadAsync(true);之后,如果阻塞了主线程,则资源卸载的操作也不会执行了。无论是同一帧阻塞,还是下一帧阻塞,都是如此。
  并且,阻塞恢复后,异步卸载的时长完全没减少。我测试的时候,执行卸载后,要经过4帧的时间asyncOperation.isDone才会变为true。我把主线程阻塞10s后恢复,Unity还是要执行4帧时间isDone才会变为true。
  为了排除主线程阻塞后,completed回调无法调回来的可能,我还尝试了死循环等待的方式:while(!asyncOperation.isDone) ;,结论与上面相同。

相关文章

  • OKHTTP

    OKHTTP 引用 权限配置 测试URL 同步请求 异步请求 异步get请求 异步测试post请求 Retrofi...

  • Java中实现异步转同步的几种方式

    Java中实现异步转同步的几种方式 Android常见的异步转同步的方式是通过Callback + Handler...

  • ab和siege

    ab和siege ab 简介 Apache Benchmark(简称ab) 是Apache安装包中自带的压力测试工...

  • java 手写并发框架(一)异步查询转同步的 7 种实现方式

    序言 本节将学习一下如何实现异步查询转同步的方式,共计介绍了 7 种常见的实现方式。 思维导图如下: 异步转同步 ...

  • 同步、异步、阻塞、非阻塞,这下明白了

    同步阻塞,同步非阻塞,异步阻塞,异步非阻塞... 晕! 头! 转! 向! 对于小白来说,理解这些概念太难了。搜索这...

  • 你的不知道的ajax

    源生: jquery 还有几个比较常用的参数:async 是否异步(默认是true)如果需要同步请求: fa...

  • 实现异步转同步

    极客时间-《Java并发编程实战》学习笔记 异步方法:调用方法,在方法中启动子线程异步调用:启动子线程调用方法异步...

  • 线程异步转同步

    学习笔记,仅供自己参考,如有不对欢迎指正 5.T1、T2、T3三个线程,如何保证它们顺序执行?也就是异步转同步的方...

  • AssetBundle入门笔记02

    AB包加载的四种方式 1.AssetBundle.LoadFromMemoryAsync(从内存中加载)异步: 同...

  • iOS 多线程基础

    转自:iOS 多线程基础 - 简书 多线程同步和异步的区别?IOS中如何实现多线程的同步? 异步:可以同时执行多条...

网友评论

      本文标题:[FA] AB包卸载异步转同步测试

      本文链接:https://www.haomeiwen.com/subject/qlcrmdtx.html