区分同步(Synchronous)和异步(Asynchronous)

Unity中同步与异步详解

目录

区分同步(Synchronous)和异步(Asynchronous)

1.同步(Synchronous)

1.1.概念

1.2.同步在普通代码中的表现

1.3.同步在线程中的限制

2.异步(Asynchronous)

2.1.概念

2.2.实现异步的两种方式

2.2.1.协程(Coroutine):单线程内的异步模拟

1)协程的异步原理

2)协程异步的使用场景

3)示例:协程异步处理分帧任务

2.2.2.线程(Thread):多线程并行的异步

1)线程的异步原理

2)线程异步的使用场景

3)示例:线程异步读取文件

3.同步 VS 异步

4.协程异步 VS 线程异步(在Unity中的关键区别)

5.如何选择同步、协程异步、线程异步?


      在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值