首页 > 编程语言 >lua协程实现异步编程模式

lua协程实现异步编程模式

时间:2024-08-23 23:15:17浏览次数:7  
标签:异步 协程 filePath coroutine lua LuaEnv Time local

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

 

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

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

 

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

local _Time = CS.UnityEngine.Time

local function WaitOneFrame()
    local co, isMain = coroutine.running()
    MonoInst:AddCallback(function()
        coroutine.resume(co)
    end)
    local result = coroutine.yield()
end

local function LoadOneResPerFrame()
    print("加载资源1, frame:", _Time.frameCount)
    WaitOneFrame()
    print("加载资源2, frame:", _Time.frameCount)
    WaitOneFrame()
    print("加载资源3, frame:", _Time.frameCount)
end

local 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);
        }
    }

}

 

运行结果:

 

标签:异步,协程,filePath,coroutine,lua,LuaEnv,Time,local
From: https://www.cnblogs.com/sailJs/p/18377160

相关文章

  • Android开发 - Looper 类处理异步任务和消息解析
    什么是LooperLooper是一个非常重要的概念,它与线程、消息队列和处理异步任务密切相关。是Android中用于管理线程的消息循环的类。它与线程中的MessageQueue结合工作,用于处理异步任务和消息Looper的主要概念消息队列(MessageQueue)一个用于存放要处理的消息和任务的队......
  • MybatisPlus Caused by: org.apache.ibatis.builder.BuilderException: Error evalua
    报错信息:org.mybatis.spring.MyBatisSystemException:nullatorg.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:97)atorg.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessi......
  • 记一次vue数据异步刷新引发的bug
    问题背景在开发过程中,为了threejs对象在watch监听中能够被顺利取到,我加了一个信号量,在初始化对象后,通过threejs对象状态和表单状态来重新渲染画面。然而,我把threejs对象从null设置为正常的对象时,页面居然卡死了。在实际的代码中,用到对象的情况只有wacth里面监听到信号量为true时......
  • 消息队列作用(解耦、异步、削峰)
    原文:消息队列作用(解耦、异步、削峰)图详解一、消息队列简介简单来说,“消息队列”是在消息的传输过程中保存消息的容器。MQ全称为MessageQueue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信。消息传递指的是程......
  • Android逆向(七) 解密COCOS游戏lua脚本-第1篇
    目录一、系统环境二、详细分析前言:1.lua脚本是什么?2.为什么游戏开发要用lua脚本?正文:获取Lua脚本的几种方法:1.直接在assets目录提取2.在luaL_loadbuffer函数处获取3.在底层的reader函数处获取1.静态分析2.动态分析一、系统环境OS:Windows_NTx6410.0......
  • Python开发中,SQLAlchemy 的同步操作和异步操作封装,以及常规CRUD的处理。
    在我们使用Python来和数据库打交道中,SQLAlchemy是一个非常不错的ORM工具,通过它我们可以很好的实现多种数据库的统一模型接入,而且它提供了非常多的特性,通过结合不同的数据库驱动,我们可以实现同步或者异步的处理封装。1、SQLAlchemy介绍SQLAlchemy 是一个功能强大且灵活的Python......
  • 开源组件——异步日志方案 spdlog 的讲解
    一:日志的作用1、定义        日志(Log)是记录系统中发生的事件或操作的详细信息的文件或数据流。这些事件或操作可能包括程序执行、系统错误、用户活动、安全事件等日志(Log)是记录系统中发生的事件或操作的详细信息的文件或数据流。这些事件或操作可能包括程序执行、系......
  • HTN7862 4V~65V输入,2.8A异步降压变换器
    1、特点 2.8A降压,内置260mΩ功率管输入电压范围:4V~65V脉冲跳跃模式使得轻载下高效率·110uA静态电流最高2MHZ可编程开关频率峰值电流控制架构欠压保护、过流保护和过热关断保护无铅封装,ESOP82、应用·12V,24V,48V工业和电信电源轨系统·汽车系统分布式电源系统高......
  • hyperf 协程作用和相关的方法
    什么是协程协程是一种轻量级的线程,由用户代码来调度和管理,而不是由操作系统内核来进行调度,也就是在用户态进行判断当前是否处于协程环境内在一些情况下我们希望判断一些当前是否运行于协程环境内,对于一些兼容协程环境与非协程环境的代码来说会作为一个判断的依据,我们可......
  • 异步编程CompletableFuture的一些使用demo
      publicstaticThreadPoolExecutorexecutor=newThreadPoolExecutor(5,5,5L,TimeUnit.SECONDS,newLinkedBlockingQueue<>(1000),newThreadPoolExecutor.CallerRunsPolicy());publicstaticvoidmain(String[]args)throwsException{Complet......