lua协程实现异步编程模式

news/2024/11/16 18:06:54/文章来源:https://www.cnblogs.com/sailJs/p/18377160

异步编程模式只是一个代码结构,c#中的async/await的写法就是异步编程模式,这边就是通过协程来达到和async/await类似的效果。

 

异步编程模式写法1:资源分帧加载

这边运行环境用的是:Unity+xLua

 

lua脚本:Assets/Lua/Test9.lua.txt

local _Time = CS.UnityEngine.Timelocal function WaitOneFrame()local co, isMain = coroutine.running()MonoInst:AddCallback(function()coroutine.resume(co)end)local result = coroutine.yield()
endlocal function LoadOneResPerFrame()print("加载资源1, frame:", _Time.frameCount)WaitOneFrame()print("加载资源2, frame:", _Time.frameCount)WaitOneFrame()print("加载资源3, frame:", _Time.frameCount)
endlocal co = coroutine.create(LoadOneResPerFrame)
local isSucc, result = coroutine.resume(co)
print("main end:", isSucc, result)

 

Test9.cs

public class Test9 : MonoBehaviour
{private LuaEnv m_LuaEnv;private Queue<Action> m_PendingQueue = new Queue<Action>();private Queue<Action> m_RunningQueue = new Queue<Action>();void Start(){m_LuaEnv = new LuaEnv();m_LuaEnv.AddLoader((ref string filePath) =>{filePath = filePath.Replace('.', '/');filePath = $"Assets/{filePath}.lua.txt";var txtAsset = AssetDatabase.LoadAssetAtPath<TextAsset>(filePath);return Encoding.UTF8.GetBytes(txtAsset.text);});m_LuaEnv.Global.Set("MonoInst", this);m_LuaEnv.DoString("require('Lua.Test9')");}void OnDestroy(){if (null != m_LuaEnv)m_LuaEnv.Dispose();}public void AddCallback(Action callback){m_PendingQueue.Enqueue(callback);}void Update(){while (m_RunningQueue.Count > 0){var act = m_RunningQueue.Dequeue();act();}while (m_PendingQueue.Count > 0){var act = m_PendingQueue.Dequeue();m_RunningQueue.Enqueue(act);}}}

 

运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/786329.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Echarts可视化大屏框架

效果图展示: 源码:<template><div><!-- Header 部分 --><div class="heads"><h3>大数据可视化分析</h3><span>2023-12-12 12:20:45</span></div><!-- 中间部分 --><div class="middle"&…

可视化表单设计生成器可以实现流程化办公吗?

通过本文可以一起走进低代码技术平台、可视化表单设计生成器的更多优势特点。实现流程化办公一直都是很多客户朋友追求的目标。那么,如何才能实现这一目标?如何为客户提供更优良的产品助力提质、降本、增效?低代码技术平台拥有可视化操作界面、更灵活、更高效、更可靠,是专…

蓝帽杯2020-Misc-签到

蓝帽杯2020-Misc-签到 一、题目 题目名:观色怎么说呢,曲曲折折发现了坑🕳,所以记录下 二、解题 根据自己总结的七大类图片隐写排🕳 1、打开010文件结构查看,本来看着是个jpg,打开是个ps过的gif,未发现附加字符串,foremost没看到其他文件,宽高不涉及修改,IDTA块正常…

Django:Swagger文档的配置

前言 第三方库drf-yasg(Django Rest Swagger)。它是一个为Django Rest Framework提供Swagger/OpenAPI规范支持的库。按照以下步骤进行操作: 安装pip install drf-yasg -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com配置 1、在项目的setting…

REST framework:过滤

一、数据准备 模型类class UserInfo(models.Model):name = models.CharField(max_length=20, verbose_name=用户名)pwd = models.CharField(max_length=18, verbose_name=密码)email = models.EmailField(max_length=40, verbose_name=邮箱)age = models.IntegerField(verbose_…

[消息队列]kafka

Kafka 如何保证消息的消费顺序? 我们在使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序,比如我们同时发了 2 个消息,这 2 个消息对应的操作分别对应的数据库操作是: 更改用户会员等级。 根据会员等级计算订单价格。 假如这两条消息的消费顺序不一样造成的最…

Miller-Rabin 与 Pollard-Rho

1 Miller-Rabin 算法 1.1 引入 Miller-Rabin 的主要作用就是判断一个较大的数是不是质数。 那么根据基础数论中提到过的试除法,我们知道朴素去判断一个数是否是质数的复杂度是 \(O(\sqrt n)\) 的,在 \(n\ge 10^{18}\) 的时候就十分不优了。 而 Miller-Rabin 则是基于费马小定…

深痛教训 2024.8.23

strlen 这种东西千万不要重复调用多次,不然会 T 飞。 单次复杂度是 \(O(len)\) 的,调用 \(n\) 次直接卡成 \(n^2\) 了。 死亡回放:评测机波动抽象,以上全是同一份代码,死因为 strlen。

ST 表

ST 表 ST 表,主要思想是空间换时间,用于解决可重复贡献问题和 RMQ 问题。 可重复贡献问题 指某个运算 \(op\),有 \(x\ op\ x\ =\ x\) 。例如 \(max(x,x)=x\ \ min(x,x)=x\ \ gcd(x,x)=x\)。 RMQ 问题 指在区间内的最大/最小值查询。 ST 表 ST 表基于倍增的思想,做到 \(O(n …

Note - kruskal 重构树

点权多叉重构树 Kruskal 重构树不仅适用于限制边权的题目,也可以处理限制点权的情况。 在某 多校冲刺 NOIP 联训测试 2021 和 CF1797F 出现了这种方法。Alex_wei的博客 进行了详细讲解。 \(Problem1.\) 「NOIP 多校联训 2021」超级加倍参考资料Alex_wei本文来自博客园,作者:…

[ARC177F] Two Airlines

DP 优化My Blogs [ARC177F] Two Airlines 有点魔怔的题。 一个基本的观察是如果当前某个人 \(A\) 拿着盒子走到了位置 \(i\),那位置小于 \(i\) 的人一定永远没用了。如果之后要用到前面的人 \(B\),就应当让 \(B\) 拿着盒子走到 \(i\) 而不是让 \(A\),这样 \(A\) 待在原来的位…

helm原理及实践

目录为什么用HelmHelm是什么简介设计目标架构核心概念如何使用客户端命令使用 为什么用Helm 它使Kubernetes应用程序的配置、部署和维护变得更加简单、可控和可重复。优势 描述模板化配置 Helm 将应用程序的配置参数化,并使用模板引擎将这些参数嵌入到配置文件中。这使得配置更…