目录
区分同步(Synchronous)和异步(Asynchronous)
在Unity和C#中,同步(Synchronous)和异步(Asynchronous)是描述代码执行流程的核心概念,直接影响程序的响应性、性能和资源利用率。结合协程(Coroutine)和线程(Thread)的使用场景,可以更清晰地理解它们的区别和适用场景。
Unity和C#中的同步(Synchronous)和异步(Asynchronous)
1.同步(Synchronous)
1.1.概念
(1)概述:同步是“按顺序等待”的执行模式。
(2)定义:代码按照编写顺序依次执行,前一个任务未完成时,后续任务必须等待,直到前一个任务执行完毕才能继续。
(3)核心特点:单任务阻塞,执行流程直观但可能导致卡顿。
1.2.同步在普通代码中的表现
在Unity的Update、Start等方法中,默认都是同步执行
using System.Threading;
using UnityEngine;
public class Test1: MonoBehaviour
{
private void Start()
{
Task1();//执行任务1(耗时2秒)
Task2();//必须等待任务1完成后才执行
}
private void Task1()
{
Debug.Log("任务1开始");
//模拟耗时操作(如大量计算)
Thread.Sleep(2000);//阻塞主线程2秒
Debug.Log("任务1完成");
}
private void Task2()
{
Debug.Log("任务2完成");
}
}
执行结果:Task1执行时会阻塞主线程2秒,期间游戏画面卡顿,Task2必须等Task1完成后才执行。注意:若Task1是耗时操作(如文件读写、复杂计算),会直接导致游戏冻结,严重影响体验。
1.3.同步在线程中的限制
线程本身可以并行执行,但线程内部的代码默认是同步的
using System.Threading;
using UnityEngine;
public class Test2: MonoBehaviour
{
private void Start()
{
//启动子线程执行同步任务
new Thread(SyncThreadTask).Start();
}
private void SyncThreadTask()
{
Step1();//必须完成后才能执行Step2
Step2();
}
private void Step1()
{
/* 耗时操作 */
Debug.Log("Step1():执行");
}
private void Step2()
{
/* 依赖Step1的结果 */
Debug.Log("Step2():执行");
}
}
子线程内部的Step1和Step2是同步执行的,但子线程的执行不会阻塞主线程(这是线程与同步的区别)。
2.异步(Asynchronous)
2.1.概念
(1)概述:异步是“不等待,先做其他事”的执行模式。
(2)定义:代码执行到耗时操作时,不阻塞当前线程,而是让线程继续处理其他任务,待耗时操作完成后再“回调”或“恢复”执行后续逻辑。
(3)核心特点:非阻塞,提高线程利用率,避免卡顿。全程线程不“同时做两件事”,只是利用“耗时操作的等待时间”做了其他任务,避免卡顿,提高效率。
用“主线程+协程加载资源”理解:
(1)初始执行:主线程执行协程代码,调用“异步加载资源”接口(比如Resources.LoadAsync<Texture2D>("image"))。
(2)委托耗时操作:主线程把“加载资源”这个耗时任务交给Unity的“资源加载管理器”(引擎层面的组件),然后“暂停协程的后续逻辑”。
(3)处理其他任务:主线程转而去执行“其他任务”(比如执行Update、渲染、UI交互),此时资源加载由“资源加载管理器”在后台处理,主线程完全不参与等待。
(4)恢复执行后续逻辑:当“资源加载管理器”完成加载后,会通知Unity的协程调度器;协程调度器在主线程的“下一个合适时机”(比如E
Unity中同步与异步详解

最低0.47元/天 解锁文章
346

被折叠的 条评论
为什么被折叠?



