当前位置: 首页 > news >正文

网站的开发费用吗域名及密码登录域名管理网站

网站的开发费用吗,域名及密码登录域名管理网站,网站建设技术思维导图,廊坊市固安县建设局网站本文为问GPT所得 一、在Unity中#xff0c;协程到底是个啥 在Unity中#xff0c;协程#xff08;Coroutine#xff09;是一种特殊的函数#xff0c;用于在一段时间内暂停执行#xff0c;并在稍后的时间点继续执行。通常情况下#xff0c;我们在代码中通过调用协程来实现… 本文为问GPT所得 一、在Unity中协程到底是个啥 在Unity中协程Coroutine是一种特殊的函数用于在一段时间内暂停执行并在稍后的时间点继续执行。通常情况下我们在代码中通过调用协程来实现一些需要延迟执行或需要分步处理的任务。 协程在Unity中有如下特点 可以在一帧中的不同时间点暂停和恢复执行而不需要等待整个帧的结束。可以方便地实现延迟执行例如在几秒后播放音效或执行一个动画。可以使用协程来实现复杂的异步任务而不需要使用回调函数或依赖于线程。 使用协程可以简化代码逻辑使得任务的实现更加清晰和可读。在Unity中可以使用C#的yield关键字来定义和控制协程的执行流程。例如可以使用yield return语句来暂停执行并在满足某个条件后继续执行。 以下是一个简单的示例演示了一个协程的用法 using UnityEngine; using System.Collections;public class CoroutineExample : MonoBehaviour {IEnumerator Start(){Debug.Log(协程开始);yield return new WaitForSeconds(2f);Debug.Log(等待了2秒后继续执行);yield return new WaitForSeconds(1f);Debug.Log(又等待了1秒后继续执行);} } 在上面的示例中Start方法是一个协程。通过yield return语句我们在协程中暂停执行了2秒和1秒并在等待结束后继续执行。当我们在MonoBehaviour中启动这个协程时它将按照我们定义的流程执行。 二、协程的原理 协程Coroutine是一种轻量级的并发编程技术它可以在单个线程内实现多个执行流的并发操作。协程的原理主要涉及到两个概念上下文切换和yield让出执行权。 上下文切换协程通过上下文切换来实现在不同协程之间的切换执行。当一个协程执行到某个位置时它会保存当前的上下文包括程序计数器、堆栈指针等信息然后切换到下一个要执行的协程恢复其保存的上下文并从切换位置继续执行。 yield让出执行权yield 是协程中的一个关键操作它可以让协程主动让出执行权将控制权交给其他协程。当一个协程执行到 yield 语句时它会暂停执行并将结果返回给调度器或其他协程同时保存当前的上下文。接下来调度器会选择另一个协程来执行将保存的上下文恢复然后继续执行。 通过上下文切换和yield操作协程能够实现非抢占式的协作式调度也就是协程主动地让出执行权而不是由操作系统或调度器去强制切换。这样可以更灵活地控制协程的执行顺序和并发度避免资源竞争和锁机制带来的开销。 在实现上协程可以由编程语言提供的原生支持如Python的asyncio、Go的goroutine也可以通过生成器Generator和状态机等手动实现。不同的语言和库对协程的具体实现方式可能略有不同但核心原理基本相似。 总结起来协程通过上下文切换和yield操作实现协作式调度使得在单个线程内能够实现多个执行流的并发操作提高了程序的并发性和灵活性。 三、程和线程的区别 当谈论协程和线程的区别时主要有以下几点 执行方式线程是由操作系统调度的最小执行单位它在操作系统的控制下运行可以并行执行。协程是由程序控制的执行单位它由程序自己在协程调度器的管理下运行可以通过协作方式实现并发。并发性线程可以在多个 CPU 核心上并行执行利用多核优势提高计算效率。而协程通常在单个线程中运行通过在不同协程间的切换实现并发无法利用多核优势。 内存和资源消耗线程在创建时需要分配独立的内存空间包括堆栈等资源同时线程切换时需要保存和恢复上下文消耗较多的内存和资源。协程则可以在一个线程中存在多个共享同一堆栈空间切换时只需要保存和恢复少量上下文消耗较少的内存和资源。同步与通信在线程中由于存在资源竞争需要使用锁机制等同步手段来保护共享资源避免数据冲突。协程通过显式地让出执行权和恢复执行权来避免资源竞争并通过通道channel等机制进行协程间的通信。 总的来说线程适合于 CPU 密集型任务可以利用多核优势提高计算效率但在高并发环境下可能存在资源竞争的问题。协程适合于 IO 密集型任务可以通过协作方式实现高并发但无法利用多核优势。根据具体的应用场景和需求选择合适的并发模型可以提高程序的性能和效率。 四、协程的函数与规则  PartⅠ 协程函数的声明协程函数必须是返回类型为 IEnumerator 的方法。在C#中我们用特殊的语法来声明协程函数即在方法签名前面添加关键字 IEnumerator。yield return 语句协程函数中通过使用 yield return 语句来控制流程。这个语句可以暂停执行并返回一个值它的值将在协程继续执行时被使用。可以使用多种类型的 yield return 语句包括 yield return null、yield return new WaitForSeconds(delayTime) 或者自定义的对象。每帧执行协程函数在不同的时间点暂停和继续。Unity自动管理协程的迭代器并在每帧中递进执行。这意味着协程函数的每个 yield return 语句将在下一帧或指定的延迟时间后执行。例如yield return null 将会在下一帧继续执行。协程生命周期协程函数的生命周期与启动它的 MonoBehaviour 组件密切相关。当 MonoBehaviour 组件启用时协程开始执行当组件禁用或销毁时协程停止执行。这意味着协程函数可以在对象激活期间执行也可以在对象非激活期间暂停执行。停止和恢复协程我们可以使用 StopCoroutine() 或 StopAllCoroutines() 来停止正在运行的协程。使用 yield break 语句可以提前结束协程的执行。如果需要重新启动协程只需再次调用它即可。 PartⅡ 6. 启动协程要启动协程可以使用 StartCoroutine() 方法。这个方法可以接受一个协程函数作为参数并在每帧中执行该函数。可以将协程函数作为参数传递给 StartCoroutine()如下所示 StartCoroutine(MyCoroutineFunction()); 注意返回的 Coroutine 对象可以用于控制和监视协程的状态如停止或暂停。 7. 停止和暂停协程通过调用 StopCoroutine() 或 StopAllCoroutines() 方法可以停止正在运行的协程。可以将协程函数作为参数传递给 StopCoroutine()如下所示 StopCoroutine(MyCoroutineFunction()); 你还可以使用 yield break 语句来提前结束协程的执行使其立即返回。 8. 嵌套协程你可以在一个协程中启动另一个协程。这被称为嵌套协程。嵌套协程可以帮助你组织和管理复杂的逻辑。要启动嵌套协程可以使用 StartCoroutine() 方法并将协程函数作为参数传递给它。 IEnumerator MyCoroutineA(){Debug.Log(协程 A 开始执行);yield return StartCoroutine(MyCoroutineB());Debug.Log(协程 A 继续执行);}IEnumerator MyCoroutineB(){Debug.Log(协程 B 开始执行);yield return new WaitForSeconds(2f);Debug.Log(协程 B 完成执行);} 在上面的示例中协程函数 MyCoroutineA() 启动了嵌套的协程 MyCoroutineB()。协程 MyCoroutineA() 在 MyCoroutineB() 完成执行后继续执行。 PartⅢ 9. WaitForSeconds和WaitForSecondsRealtime可以使用 yield return new WaitForSeconds(delayTime) 或 yield return new WaitForSecondsRealtime(delayTime) 来暂停协程的执行一段指定的时间。其中 WaitForSeconds 以游戏时间为基准计时而 WaitForSecondsRealtime 以实际时间为基准计时。这两个等待语句对于实现延迟执行或定时操作非常有用。 IEnumerator MyCoroutine(){Debug.Log(等待2秒);yield return new WaitForSeconds(2f);Debug.Log(继续执行);} 10. 异常处理协程中的异常处理可以通过使用 try-catch 语句来实现。异常会中断协程的执行并且可以捕获和处理异常。在捕获到异常后你可以决定是继续执行协程还是提前结束协程。 IEnumerator MyCoroutine(){try{// 协程逻辑}catch (Exception ex){// 处理异常} 11. 返回值协程函数可以返回一个值这个值可以通过 yield return 语句返回。这个返回值可以在调用 StartCoroutine() 后使用返回的 Coroutine 对象的 Coroutine.Current 属性访问。  IEnumerator MyCoroutine(){yield return 10;}void Start(){Coroutine coroutine StartCoroutine(MyCoroutine());int value (int)coroutine.Current;} 12. 停止全部协程在某些情况下你可能需要停止场景中所有正在运行的协程。可以使用 StopAllCoroutines() 方法来停止全部协程的执行。 void StopAllCoroutines(){StopAllCoroutines();} PartⅣ 13. 异步操作和回调协程可以用于实现异步操作和回调。通过使用 yield 和 yield return 语句可以在协程中等待异步操作完成然后根据需要执行相应的逻辑。这样可以避免使用回调函数使代码更加清晰和可读。 IEnumerator MyCoroutine(){// 等待异步操作完成yield return SomeAsyncOperation();// 异步操作完成后执行的逻辑Debug.Log(异步操作完成);}IEnumerator SomeAsyncOperation(){// 异步操作的逻辑yield break;} 14. 迭代器块和状态机协程本质上是一种特殊类型的迭代器块。迭代器块是一种可中断和恢复的迭代器它允许在每次迭代之间保持状态并在需要时从上次离开的位置继续执行。 在使用协程时应该了解协程的执行机制。虽然它们看起来像是同步的代码但实际上它们是在每帧中部分执行的。这意味着在每个 yield return 语句之后协程将暂停执行并返回到调用它的代码然后在下一帧继续执行。 PartⅤ 15. Coroutine对象的状态检查可以使用 Coroutine 对象的 Coroutine.Current 属性来检查协程的当前状态。状态可以是以下三种之一 Null协程未启动或已经完成。   Coroutine协程正在执行中。   CoroutineSuspended协程已被暂停。 这个状态检查可以帮助你在需要时对协程进行额外的控制和处理。 16. 协程与主线程交互在协程中可以使用 yield return null 来让出主线程在下一帧继续执行协程。这对于需要与主线程进行交互的场合非常有用如更新UI元素或处理用户输入。 IEnumerator MyCoroutine(){Debug.Log(协程开始执行);yield return null; // 让出主线程Debug.Log(协程在下一帧继续执行);} 这样你可以确保在协程执行过程中及时响应主线程的事件。 17. 协程作为事件驱动处理器协程可以用作事件驱动处理器以响应事件并执行相关的逻辑。例如你可以在协程中监听输入事件、定时事件或其他自定义事件并在相应的事件发生时执行相应的协程代码。 IEnumerator InputCoroutine(){while (true){if (Input.GetKeyDown(KeyCode.Space)){Debug.Log(Space键被按下);yield return new WaitForSeconds(1f);}yield return null;}} 在这个示例中协程将持续监听 Space 键的按下事件并在事件发生后等待1秒钟。这种方式可以在不使用传统的事件监听器的情况下以类似事件驱动的方式响应输入。 这些是关于协程函数和规则的进一步信息。协程是一种非常强大和灵活的功能可用于处理各种异步、延迟和分步的任务。通过熟悉协程的概念和规则你可以更好地利用它们来编写高效、可读和易于维护的代码。 PartⅥ 18. 协程组协程组是一种用于管理多个协程的结构。通过将协程添加到协程组中你可以对整组协程进行统一的管理操作如启动、停止和暂停。这对于同时管理多个相关的协程非常有用。  IEnumerator CoroutineA(){yield return new WaitForSeconds(2f);Debug.Log(协程A完成);}IEnumerator CoroutineB(){yield return new WaitForSeconds(3f);Debug.Log(协程B完成);}void Start(){CoroutineGroup coroutineGroup new CoroutineGroup();coroutineGroup.AddCoroutine(CoroutineA());coroutineGroup.AddCoroutine(CoroutineB());StartCoroutine(coroutineGroup.StartGroup());}在上面的示例中我们创建了一个协程组 coroutineGroup并向其中添加了协程 CoroutineA 和 CoroutineB。然后通过 coroutineGroup.StartGroup() 方法启动协程组中的所有协程。 19. 协程状态回调协程状态回调可以让你在协程的各种状态下执行特定的逻辑。通过使用 Unity 的 IEnumerator 扩展方法 OnCoroutineComplete() 和 OnCoroutineCanceled()你可以定义协程完成或取消时的回调函数。  IEnumerator MyCoroutine(){yield return new WaitForSeconds(2f);Debug.Log(协程完成);}void Start(){StartCoroutine(MyCoroutine().OnCoroutineComplete(OnCoroutineCompleted));}void OnCoroutineCompleted(){Debug.Log(协程完成回调);}在上面的示例中我们使用 OnCoroutineComplete() 方法将 OnCoroutineCompleted() 方法作为回调函数传递给协程。当协程完成时将调用回调函数。 20. 超时处理协程可以配合超时处理机制来处理耗时操作。通过在协程中使用计时器和条件判断你可以控制协程执行的时间并在超时时执行相应的逻辑。   IEnumerator MyCoroutine(){float startTime Time.time;float timeout 5f;while (Time.time - startTime timeout){// 执行协程逻辑yield return null;}Debug.Log(协程超时);} 在上面的示例中我们使用计时器和条件判断来控制协程执行的时间。如果协程的执行时间超过设定的超时时间则输出相应的信息。 PartⅦ 在上面的示例中协程A在其执行过程中启动了协程B并在协程B完成后继续执行自身的逻辑。这种嵌套可以用于处理任务的顺序和依赖关系使代码更具可读性和可维护性。 21. 协程的动态启动和停止除了使用 StartCoroutine() 和 StopCoroutine() 方法外协程还可以使用 yield return StartCoroutine() 和 yield return StopCoroutine() 语句来动态地启动和停止协程。 IEnumerator CoroutineA(){Debug.Log(协程A开始执行);yield return StartCoroutine(CoroutineB()); // 动态启动协程BDebug.Log(协程A继续执行);}IEnumerator CoroutineB(){Debug.Log(协程B开始执行);yield return StartCoroutine(CoroutineC()); // 动态启动协程CDebug.Log(协程B完成);}IEnumerator CoroutineC(){Debug.Log(协程C开始执行);yield return new WaitForSeconds(2f);Debug.Log(协程C完成);}在上面的示例中协程A启动了协程B协程B启动了协程C。这种动态启动和停止的方式可以根据需要控制协程的执行流程。 五、举例 using UnityEngine; using System.Collections;public class CoroutineExample : MonoBehaviour {private WaitForSeconds waitTime;private void Start(){waitTime new WaitForSeconds(1f);// 启动协程StartCoroutine(SpawnObjects());}private IEnumerator SpawnObjects(){while (true){// 生成一个随机位置的立方体Vector3 randomPosition new Vector3(Random.Range(-5f, 5f), 0f, Random.Range(-5f, 5f));GameObject cube GameObject.CreatePrimitive(PrimitiveType.Cube);cube.transform.position randomPosition;// 每隔一秒生成一个新的立方体yield return waitTime;}} } 在上面的示例中我们定义了一个 CoroutineExample 的脚本其中包含了一个协程 SpawnObjects。在 Start() 方法中我们通过 StartCoroutine() 启动了这个协程。 协程 SpawnObjects 持续生成随机位置的立方体并在每隔一秒的时间间隔后生成一个新的立方体。通过使用 yield return waitTime 语句协程将等待一秒钟后继续执行。 这个示例展示了如何利用协程来延迟执行和重复执行一段逻辑从而实现在游戏中按一定时间间隔生成对象的效果。
http://www.pierceye.com/news/638849/

相关文章:

  • 男女做那个的视频网站网站建设合同英文版
  • 营销型企业网站怎么建站做外账要登什么网站
  • 网站经营性备案莞城东莞网站建设
  • 网站开发的实施方案章丘建设局网站
  • 贴吧网站开发需求分析北京网站建设V芯ee8888e
  • 桂林建设信息网站wordpress仿盗
  • 建材营销型的网站微博登录网站开发
  • 百度联盟怎么做网站家乡网站建设策划书模板
  • wordpress开发中介网站我要进入手机建设银行网站
  • 电商网站大全wordpress弹幕主题
  • 钱站网站如何拉美贸易网
  • 网页无法访问如何解决h5云南seo公司
  • 杭州手机建设网站做宣传的网站有哪些
  • 密云青岛网站建设手机网站页面设计
  • 网站开发学习步骤网站开发合同要注意哪些
  • 制作网站要花多少钱如何装饰设计公司哪个好
  • vue做网站的优缺点番禺最新发布
  • 免费模板素材网站有哪些免费中文网站模板html
  • 本地建设多个网站链接平安保险网站
  • wordpress安装主题后无法查看媒体seo内容优化
  • 广告在线制作图片外贸推广建站蓝颜seo牛
  • 成都网站创建wordpress 未找到
  • 网站seo链接购买长宁广州网站建设
  • 网站分类导航代码wordpress笔记主题
  • 网站常用代码阿里云 全国网站建设
  • 盗取dede系统做的网站模板深圳建设工程信息网站
  • 百度SEO网站江门网站建设公司哪家好
  • 成都网站建设 四川冠辰科技php响应式网站
  • 大连网站建设辽icp备阿里云 网站
  • 网站开发前期准备做网站渠道