简单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 ...
最新文章
- 实例手册_独家数据 | 1820Fall 香港研究生商科类14个热门专业 1400+申请实例汇总...
- ping 命令的几种使用方法?
- 程序员面试金典 - 面试题 08.05. 递归乘法(位运算)
- Opencv--bitwise_and、bitwise_not等图像基本运算及掩膜
- 解决easyui textarea 值不显示及获取textarea的值
- java 获得平台编码_关于Java平台的编码
- golang库文件收集
- SqlServer 2008还原数据库步骤
- 京东和天猫的运营模式的区别
- java kvm_KVM环境搭建
- 关于poi处理word换行问题
- oa系统服务器地址怎么查找,oa系统的服务器地址怎么看
- 麦田守望者--走出软件作坊:三五个人十来条枪 如何成为开发正规军(四十三)...
- matlab中三视图如何画,[matlab 三维图]怎样把三维图导入到MATLAB
- 基于JAVA网上体育用品销售系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
- 158. 精读《Typescript 4》
- php file_put_contents 根目录权限,php – Composer:file_put_contents(./ composer.json):无法打开流:权限被拒绝...
- Mysql存储引擎Innodb的读写锁、行级锁
- 长沙理工大学第十二届ACM大赛-重现赛
- 从“真快乐”APP看国美的野心,不止娱乐零售
热门文章
- CTO离职前悄悄传了我一招,和我说吃透跳槽涨薪指日可待
- Linux桌面操作系统性能分析学习总结
- 106码号办理需要具备的条件和需要的材料
- DRAM 相关故障(Rowhammer、SPOILER、RAMBleed、TRRespass、Half-Double)
- Ubuntu16.04.06 LTS -bash 进程占用cpu很高,中了挖矿病毒
- 日本“冷知识”你都知道吗?
- 使用sharding做分库分表,使用jpa,发生的save不报错,数据库缺插不进去数据的问题
- 数据分析入门(一)数据加载及初步分析
- drwtsn32简介
- 数学之美 | 余弦定理和新闻分类