一起来玩U3D之协程基础

程序、进程、线程

程序是以文件的形式被存放在外存储器的一组指令的有序集合,是静态的概念,运行一个程序首先要将程序文件从外存储器调入内存才能运行。进程是一个正在执行的程序,是一个动态的概念,简单来说程序被执行调入内存后被称为进程[CPU只能访问内存的数据],进程可以细分为线程,这样可以充分共享资源,减少内存开内销提高并发性。

好,简单的了解了程序、进程、线程的关系之后,我们来看看unity的协程到底是什么。
  • 协程的概念:伴随着主线程⼀起运⾏的⼀段程序。
  • 注意:协程既不是进程,也不是线程,而只是函数
创建协程的方法
  • 返回值关键字 IEnumerator
  • 必须返回 Yield Return,只要发现yield关键字,就会暂停协程,等待下一帧或者规定的时间后执行
yield有以下情况:
  • yield return 【具体的值】:等待下⼀帧继续执⾏ (Update之后)
  • yield return new WaitForEndOfFrame() :等待下⼀帧继续执⾏(OnGUI之后)
  • yield return new WaitForSeconds(n) :等待n秒之后继续执⾏
  • yield return new WaitForFixedUpdate() :等待⼀个fixed的时间间隔之后继续执⾏
  • yield return StartCoroutine(协程⽅法); : 等待yield return 的协程执⾏完了之后继续执⾏
开启协程的方法
  • StartCoroutine(协程⽅法([协程参数]))
  • StartCoroutine(”⽅法名称”)
  • StartCoroutine(”⽅法名称”,⽅法参数)——注意,此种方式,参数只能有一个
停止协程
  • StopCoroutine(Coroutine)
  • StopCoroutine(IEnumerator)
  • StopCoroutine(string methodName)——注意,此种方式,只能停掉用字符串启动的协程
  • StopAllCoroutine:停⽌所有正在运⾏的协程————慎用!!!
跳出携程
  • yield break
特殊协程
  • IEnumerator Start()——Start协程会在游戏开始时⾃动启动
下面是一个用协程写的塔防游戏出怪的简单的Demo
using UnityEngine;
using System.Collections;
using System;

public class IEDemo : MonoBehaviour {

    private void Start()
    {
        //StartCoroutine(coroutine());
    }

    IEnumerator coroutine()
    {
        for (int i = 0; i < 5; i++)
        {
            yield return new WaitForSeconds(5);

            for (int j = 0; j < 10; j++)
            {
                yield return new WaitForSeconds(1);

                Debug.Log("第" + (i + 1) + "波,第" + (j + 1) + "个怪。");
            }
        }
    }

}

好了,以上就是对unity中协程的简单介绍。

点个关注,给个赞呗!

### 协程、线程与进程的基本概念 在 Unity3D 开发中,协程、线程和进程是处理并行任务的不同方式。它们各自有不同的特性和适用场景。 #### 协程 (Coroutine) 协程是一种轻量级的执行机制,允许方法暂停执行并在未来的某个时刻继续执行。协程始终运行在主线程中,并且通过 `yield` 语句控制执行流程。由于协程不涉及真正的多线程,因此无需担心线程同步问题[^2]。 **特点:** - 运行在主线程上。 - 适用于帧更新中的异步操作,如等待特定时间或条件立。 - 不能用于 CPU 密集型任务,因为它会阻塞主线程。 ```csharp IEnumerator ExampleCoroutine() { Debug.Log("Start"); yield return new WaitForSeconds(1f); Debug.Log("After 1 second"); } ``` #### 线程 (Thread) 线程是操作系统级别的执行单元,多个线程可以并行执行。Unity 允许开发者使用 C# 的 `System.Threading.Thread` 类创建子线程来执行耗时任务[^2]。 **特点:** - 可以并行执行,适合处理计算密集型或 I/O 操作。 - Unity API(如 GameObject 操作)只能在主线程中调用。 - 需要处理线程间通信和资源同步问题。 ```csharp void Start() { Thread thread = new Thread(DoWork); thread.Start(); } void DoWork() { for (int i = 0; i < 1000000; i++) { if (i % 100000 == 0) Debug.Log("Thread: " + i); } } ``` #### 进程 (Process) 进程是操作系统中资源分配的基本单位,每个进程都有独立的内存空间。在 Unity 开发中,通常不会直接涉及进程管理,因为整个游戏通常作为一个单独的进程运行[^2]。 **特点:** - 拥有独立的内存空间。 - 进程间通信较为复杂,通常需要借助 IPC、Socket 或其他机制实现。 - 在 Unity 中较少使用,除非涉及到与其他程序交互的情况。 --- ### 协程、线程与进程的区别总结 | 特性 | 协程 | 线程 | 进程 | |------|------|------|------| | **执行环境** | 主线程内作式调度 | 操作系统级别并行执行 | 独立的内存空间 | | **是否并行** | 否(按帧逐步执行) | 是(可真正并行) | 是(完全隔离) | | **资源共享** | 共享堆,不共享栈 | 共享同一进程的资源 | 独立资源 | | **适用场景** | 异步逻辑、定时器、动画控制 | 大量计算、网络请求等后台任务 | 多个独立应用之间的通信 | 协程适用于不需要真正并行的任务,而线程则更适合需要充分利用多核 CPU 的情况。进程主要用于跨应用程序的数据交换,在 Unity 中并不常见[^2]。 --- ### 使用建议 - 对于简单的异步逻辑(如加载资源、等待一段时间后触发事件),推荐使用协程。 - 如果遇到大量数据处理或长时间 I/O 操作,则应考虑使用线程。 - 当需要与外部程序交互时,可能需要用到进程相关技术,但在 Unity 中这种情况较少见。 此外,需要注意的是,尽管可以通过 Native 插件在 Android 或 iOS 平台创建子线程,但仍然必须确保所有对 Unity 引擎对象的操作都在主线程完[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值