做三消项目需要做一个提示用户哪个格子可以消除的功能,需要对整个棋盘进行遍历。

原来没用协程的代码

public void GetTip()
{
GameObject go1, go2;int[] way = { 1, -1, -10, 10 };int max = (xl - 1) * 10 + yl - 1;for (int x = 0; x < xl; x += 2){for (int y = 0; y < yl; y++){int gid = GetGridID(x, y);for (int i = 0; i <= 3; i++){int newGid = gid + way[i];if (newGid <= max && newGid >= 0 && newGid % 10 < yl){Swap(ref DicGrid[newGid].GridType, ref DicGrid[gid].GridType);if (ComparatorTip(newGid)){go1 = DicGrid[gid].gameObject;go2 = DicGrid[newGid].gameObject;HighLight(go1);HighLight(go2);Swap(ref DicGrid[newGid].GridType, ref DicGrid[gid].GridType);return;}else Swap(ref DicGrid[newGid].GridType, ref DicGrid[gid].GridType);}}}}return ;
}

代码很多,只看重点,代码里的二重循环对游戏主循环有很大影响,每次用户点击按钮都要卡一下,但是unity不允许在这种地方用多线程,所以,只能改成协程,让这个功能分几个帧完成,就可以感觉不到卡顿。

修改后的代码

public void GetTipGo(){StartCoroutine("IGetTipGo");}IEnumerator IGetTipGo(){GameObject go1, go2;int[] way = { 1, -1, -10, 10 };int max = (xl - 1) * 10 + yl - 1;for (int x = 0; x < xl; x += 2){for (int y = 0; y < yl; y++){int gid = GetGridID(x, y);for (int i = 0; i <= 3; i++){int newGid = gid + way[i];if (newGid <= max && newGid >= 0 && newGid % 10 < yl){yield return 0;Swap(ref DicGrid[newGid].GridType, ref DicGrid[gid].GridType);if (ComparatorTip(newGid)){yield return 0;go1 = DicGrid[gid].gameObject;go2 = DicGrid[newGid].gameObject;HightLight(go1);HighLight(go2);Swap(ref DicGrid[newGid].GridType, ref DicGrid[gid].GridType);StopCoroutine("IGetTipGo");}else Swap(ref DicGrid[newGid].GridType, ref DicGrid[gid].GridType);}}}}StopCoroutine("IGetTipGo");}

用两个yield return 0;将几个比较耗时间的运算用帧分开,原来的return改为StopCoroutine();

这样就可以释放主循环的压力了。

PS:进阶技巧

协程与多线程的结合

参考博客

http://blog.csdn.net/laipixiaoxi/article/details/51890903

简单unity协程优化方案相关推荐

  1. Unity协程简述(简单用法,简易分析)

    Unity协程 协程的简单用法 简述 函数 协程的执行顺序 协程替我们做了什么 Yleid Return 如何进行跳帧,延迟,等待的操作 从IL的角度分析 IL语言 总结 自定义一个迭代器 优化 最后 ...

  2. Unity协程的简单应用

    Unity协程是一种特殊的函数,可以让你在Unity中创建一种类似于多线程的异步操作.它可以在需要等待某个操作完成时,暂停执行当前代码,等待某个条件满足后再继续执行. 在一般情况下 unity中调用函 ...

  3. unity怪物攻击玩家减血_利用Unity协程实现一个简单的怪物寻路与跟随AI

    利用Unity协程实现一个简单的怪物寻路与跟随AI,通过分析怪物行为与逻辑,实现简单的平面怪物寻路与跟随效果. 分析 对于游戏中怪物的行为,简单归纳为如下几部分: 怪物在预设范围内随机移动. 玩家走入 ...

  4. unity 协程特点

    协程 一. Unity中使用协程 1. 什么是协程 2. 如何使用 3. 协程的应用场景 创建补间动画 打字机效果 异步加载资源 4. 注意事项 二. Unity协程的底层原理 1. 协程本体:C#的 ...

  5. 【Unity】Unity协程(Coroutine)的原理与应用

    文章目录 前言 一.什么是协程 二.应用场景 1.异步加载资源 2.将一个复杂程序分帧执行 3.定时器 三.协程的使用 注意事项 四.Unity协程的底层原理 1. 协程本体:C#的迭代器函数 2. ...

  6. Unity协程(Coroutine)原理深入剖析再续

    Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine ...

  7. Unity 协程原理探究与实现

    目录 一.介绍 二.迭代器 三.原理 四.总结 一.介绍 协程Coroutine在Unity中一直扮演者重要的角色.可以实现简单的计时器.将耗时的操作拆分成几个步骤分散在每一帧去运行等等,用起来很是方 ...

  8. Unity 协程深入解析与原理

    先来直接放一段代码 1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 p ...

  9. Unity协程实现分析以及Lua协程与Unity协程的混合使用

    1,节选翻译一篇stackoverflow关于Unity协程实现的讨论 - The big clues are in the C# version. Firstly, note that the re ...

最新文章

  1. 实例手册_独家数据 | 1820Fall 香港研究生商科类14个热门专业 1400+申请实例汇总...
  2. ping 命令的几种使用方法?
  3. 程序员面试金典 - 面试题 08.05. 递归乘法(位运算)
  4. Opencv--bitwise_and、bitwise_not等图像基本运算及掩膜
  5. 解决easyui textarea 值不显示及获取textarea的值
  6. java 获得平台编码_关于Java平台的编码
  7. golang库文件收集
  8. SqlServer 2008还原数据库步骤
  9. 京东和天猫的运营模式的区别
  10. java kvm_KVM环境搭建
  11. 关于poi处理word换行问题
  12. oa系统服务器地址怎么查找,oa系统的服务器地址怎么看
  13. 麦田守望者--走出软件作坊:三五个人十来条枪 如何成为开发正规军(四十三)...
  14. matlab中三视图如何画,[matlab 三维图]怎样把三维图导入到MATLAB
  15. 基于JAVA网上体育用品销售系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  16. 158. 精读《Typescript 4》
  17. php file_put_contents 根目录权限,php – Composer:file_put_contents(./ composer.json):无法打开流:权限被拒绝...
  18. Mysql存储引擎Innodb的读写锁、行级锁
  19. 长沙理工大学第十二届ACM大赛-重现赛
  20. 从“真快乐”APP看国美的野心,不止娱乐零售

热门文章

  1. CTO离职前悄悄传了我一招,和我说吃透跳槽涨薪指日可待
  2. Linux桌面操作系统性能分析学习总结
  3. 106码号办理需要具备的条件和需要的材料
  4. DRAM 相关故障(Rowhammer、SPOILER、RAMBleed、TRRespass、Half-Double)
  5. Ubuntu16.04.06 LTS -bash 进程占用cpu很高,中了挖矿病毒
  6. 日本“冷知识”你都知道吗?
  7. 使用sharding做分库分表,使用jpa,发生的save不报错,数据库缺插不进去数据的问题
  8. 数据分析入门(一)数据加载及初步分析
  9. drwtsn32简介
  10. 数学之美 | 余弦定理和新闻分类