1.基于Unity的异异步游戏框架设计(6)-令牌不传染的异步任务设计 (async/await)
2.Unity3D:异步加载场景资源进度条
基于Unity的游戏框架设计(6)-令牌不传染的异步任务设计 (async/await)
基于Unity的游戏框架设计中,异步任务的步加高效与实用性显著提升游戏体验。异步操作避免了主线程阻塞,载源载u资源使得游戏在加载UI面板、码下物体时,加载能够保持流畅运行,异异步微橙分销系统源码下载且主线程能够执行其他任务。步加与同步加载相比,载源载u资源异步加载能够显著减少游戏卡顿,码下提高性能。加载
异步任务的异异步实现方式多样,包括回调方式、步加Unity Coroutine和async/await模型。载源载u资源其中,码下async/await模型因其性能、加载可读性及广泛采用而受到推崇。UniTask和ETTask基于async/await模型构建,acos的源码提供高性能与易用性。
深入探讨async/await模型,我们可以发现其原理在于状态机与编译器魔法。通过async关键字标记的方法,编译器会自动生成状态机,实现异步操作的流畅执行。同时,async方法返回值需具备特定特性,ip源码计算如支持异步方法的创建,以确保异步执行流程的顺利进行。
UniTask与ETTask作为优秀的异步框架,分别采用值类型与引用类型实现,均通过内存池消除GC影响,并支持与Unity Coroutine的高效对接。然而,它们在设计与实现上各有侧重,优化roc源码适应不同场景需求。
在设计过程中,无传染令牌、可取消、可暂停的异步设计成为关键。通过自动传递取消令牌,简化了异步操作的管理与控制,提高了开发效率。米粒源码屋在此基础上,实现Awaiter接口与泛型支持,结合CancellationToken机制,构建了灵活且强大的异步执行流程。
此外,为增强异步框架的扩展性与兼容性,LifeCycleSwitch、Delay、Lock And Unlock、WaitUntil、ThreadPromise与SwitchThreadAwaiter等组件应运而生,满足不同场景的异步需求。通过静态拓展类,简化了对象申请、绑定与返回的流程,使得异步操作更加高效、直观。
综上所述,基于Unity的游戏框架设计中的异步任务设计,通过合理的架构与高效实现,显著提升了游戏性能与用户体验。从异步任务的实现到组件扩展,每一步都旨在优化游戏加载、执行流程,确保流畅、高效的运行环境。
Unity3D:异步加载场景资源进度条
Unity3D中很多时候需要用到异步加载场景或资源.如异步打开一个非常大的场景;两个场景之间的一个过渡;游戏关卡的加载等等,通过添加一个进度条场景的方式可以很好的增强客户体验,并让客户了解场景的加载进程.本文主要介绍进度条场景的实现方法和异步加载AsyncOperation
场景搭建:任意建两个场景,分别命名为testScene1、testScene2,两个场景中分别设置"切换场景"按钮,便于立昂场景之间的相互切换,注意,两个切换按钮加载的的场景均是"loadScene";建loadScene场景,用于处理加载进度条.
导入NGUI资源包,在Unity3D菜单栏中选中NGUI-Open-Prefab Toolbar,在Prefab Toolbar窗口中,选中Control - Colored Progress Bar拖拽至Hierarchy面板,修改名字为"Loading";
在Hierarchy面板,Loading添加子物体Label,Label的Context内容为"loading",适当调整字体大小.创建脚本LoadingScripts,UI Root的摄像机Camera添加组件LoadingScripts
LoadingScripts脚本代码如图所示. objProcessBar.GetComponentUISlider().value = acOp.progress; 异步加载场景testScene2的速度直接决定了进度条的实际进展速度.
你会发现,加载场景loadScene一闪而过,迅速的就跳转到了场景testScene2.完全无法看到进度条进展的过程.原因是,场景loadScene太小,加载场景loadScene的时间非常非常短,此时用加载场景的速度来控制进度条的进展速度就会让加载场景失去它存在的意义.上述代码简单实用性强,非常适合加载大场景大资源等耗时长的情况
为了满足小资源/场景加载时也显示出进度条,使用如下图所示代码.AsyncOperation另一个重要的属性AsyncOperation.allowSceneActivation acOp.allowSceneActivation = false; acOp.allowSceneActivation = true; 当acOp.allowSceneActivation = false即使场景已经加载完成,也不会自动跳转,直到acOp.allowSceneActivation = true;
实验一下效果,进度条进展效果良好.仔细观察,进度条1%、2%、3%到%,完全按照i++的代码设定执行.这时进度条的额进展速度与异步加载场景的速度无关
之所以能够得到满意的效果,每一个百分比的进度都能展示在我们眼前,是因为这个脚本中还有一个重要的语句.yield return new WaitForEndOfFrame();
将该语句移到while循环语句的大括号外面,再次运行Unity3D,看一下效果,你会发现,加载场景loadScene再次一闪而过.这是因为这里的while循环只处理了一个判断i 是否小于 ,一个i++,和一个赋值语句,电脑的执行速度是非常快的,快的有时人眼无法识别.这时 yield return new WaitForEndOfFrame();派上了大用场,每次复制完毕,都要等到帧渲染结束,才能进行下一次循环
赋值语句 objProcessBar.GetComponentUISlider().value = i / ;每次赋值一次,Loading-Thumb-Label的数值就要改变一次,Loading-Overlay的显示面积也会改变一次,每次都要等这些帧渲染完毕,才能进行下一次的循环.yield return new WaitForEndOfFrame()就可以使进度条以肉眼可辨的速度进行变化
异步操作AsyncOperation只有四个属性(Unity圣典中只介绍了三个,还有一个属性是allowSceneActivation),灵活运用四个属性,才能得到想要的效果