简单unity协程优化方案
做三消项目需要做一个提示用户哪个格子可以消除的功能,需要对整个棋盘进行遍历。
原来没用协程的代码
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协程优化方案相关推荐
- Unity协程简述(简单用法,简易分析)
Unity协程 协程的简单用法 简述 函数 协程的执行顺序 协程替我们做了什么 Yleid Return 如何进行跳帧,延迟,等待的操作 从IL的角度分析 IL语言 总结 自定义一个迭代器 优化 最后 ...
- Unity协程的简单应用
Unity协程是一种特殊的函数,可以让你在Unity中创建一种类似于多线程的异步操作.它可以在需要等待某个操作完成时,暂停执行当前代码,等待某个条件满足后再继续执行. 在一般情况下 unity中调用函 ...
- unity怪物攻击玩家减血_利用Unity协程实现一个简单的怪物寻路与跟随AI
利用Unity协程实现一个简单的怪物寻路与跟随AI,通过分析怪物行为与逻辑,实现简单的平面怪物寻路与跟随效果. 分析 对于游戏中怪物的行为,简单归纳为如下几部分: 怪物在预设范围内随机移动. 玩家走入 ...
- unity 协程特点
协程 一. Unity中使用协程 1. 什么是协程 2. 如何使用 3. 协程的应用场景 创建补间动画 打字机效果 异步加载资源 4. 注意事项 二. Unity协程的底层原理 1. 协程本体:C#的 ...
- 【Unity】Unity协程(Coroutine)的原理与应用
文章目录 前言 一.什么是协程 二.应用场景 1.异步加载资源 2.将一个复杂程序分帧执行 3.定时器 三.协程的使用 注意事项 四.Unity协程的底层原理 1. 协程本体:C#的迭代器函数 2. ...
- Unity协程(Coroutine)原理深入剖析再续
Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine ...
- Unity 协程原理探究与实现
目录 一.介绍 二.迭代器 三.原理 四.总结 一.介绍 协程Coroutine在Unity中一直扮演者重要的角色.可以实现简单的计时器.将耗时的操作拆分成几个步骤分散在每一帧去运行等等,用起来很是方 ...
- Unity 协程深入解析与原理
先来直接放一段代码 1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 p ...
- Unity协程实现分析以及Lua协程与Unity协程的混合使用
1,节选翻译一篇stackoverflow关于Unity协程实现的讨论 - The big clues are in the C# version. Firstly, note that the re ...
最新文章
- 端到端对话模型新突破!Facebook发布大规模个性化对话数据库
- 程序员自学到底有没有用?网友们吵翻了...
- 目前我见过的.net开源的或者免费的比较好的资源
- 遍历——PowerShell三分钟(十)
- 【互联网本周大事记】Uber估值400亿了呢!
- [easyui] 在iframe中操作父窗口的组件
- EGOImageView 解析
- Js数据类型之——Date
- matlab符号函数绘图法_matlab制图—符号函数(显函数、隐函数和参数方程)画图
- OLTP与OLAP介绍
- 在java中使用关键字导入包_java的import关键字的使用
- 使用python实现栈和队列
- 不如跳舞!伯克利的舞蹈动作迁移效果逆天
- LeetCode8 字符串转整数
- Execution failed for task :Test:lintVitalRelease/Lint found fatal errors while assembling a release
- python如何输出结果到txt_python 执行结果输出为txt
- ISO/IEC 27701:2019(隐私信息安全管理扩展要求和指南)解读(一)
- EasyOcr报错 --- [WinError 10054] An existing connection was forcibly closed by the remote host
- where和group by能一起使用吗?
- 佳能eosr控制环能否计算机控制,镜头不够EF口来凑 佳能EOS R转接性能测试