当前位置: 首页 > news >正文

toluaframework中C#怎么调用Lua的方法以及无GC方法

toluaframework中C#怎么调用Lua的方法

  • 问题
    • Util.CallMethod
    • LuaManager.CallFunction
    • LuaFunction.LazyCall
  • 解决方案
    • LuaFunction脚本
    • 无GC消耗的调用
  • 用法总结

问题

用过luaframework框架的人应该都知道框架提供了Util的工具类,工具类提供了一个方法就是Util.CallMethod的方法,方便Unity中直接调用lua层的方法。

Util.CallMethod

        /// <summary>/// 执行Lua方法/// </summary>public static object[] CallMethod(string module, string func, params object[] args){LuaManager luaMgr = AppFacade.Instance.GetManager<LuaManager>(ManagerName.Lua);if (luaMgr == null){Debug.LogError("lua模块“" + module + "”未被找到");return null;}return luaMgr.CallFunction(module + "." + func, args);}

LuaManager.CallFunction

下面这里使用的框架提供的方法,但是这个方法是有GC的,我们在进入到luaMgr.CallFunction中查看一下

// Update is called once per framepublic object[] CallFunction(string funcName, params object[] args) {LuaFunction func = lua.GetFunction(funcName);if (func != null) {return func.LazyCall(args);}return null;}

从上面的代码中我们可以看到实际上他调用的是LazyCall(),这个方法的返回值是object[],这必然是需要我们自己拆箱装箱,有GC的操作,尽可能避免拆箱装箱可以减少性能的消耗。

LuaFunction.LazyCall

这个方法作者也提示了是有GC的,这里让我们使用的是Invoke的方法调用,这样我们不需要有装箱拆箱的转换操作,这里可以直接转换成我们需要的数据。

        //慎用, 有gc alloc[System.Obsolete("LuaFunction.LazyCall() is obsolete.Use LuaFunction.Invoke()")]public object[] LazyCall(params object[] args){BeginPCall();int count = args == null ? 0 : args.Length;if (!luaState.LuaCheckStack(count + 6)){EndPCall();throw new LuaException("stack overflow");}PushArgs(args);PCall();object[] objs = luaState.CheckObjects(oldTop);EndPCall();return objs;}

解决方案

这里我只举一个例子写一个两个参数的方法,多个参数的方法模仿我这个自己写就好了,需要多少参数写多少个方法即可

LuaFunction脚本

我们先看看这个脚本作者给我们提供了什么
这里作者给我们提供了无返回值的多参数Call的方法,也提供了有返回值的多参数Invoke
在这里插入图片描述

无GC消耗的调用

找到LuaManager脚本中原始有GC消耗的脚本,在他下方我们加两个多态写法
在这里插入图片描述
添加两个无GC消耗的多态方法

 	// Update is called once per frame 原始有GC的方法public object[] CallFunction(string funcName, params object[] args) {LuaFunction func = lua.GetFunction(funcName);if (func != null) {return func.LazyCall(args);//这里有GC}return null;}//有返回值并且有两个参数的无GC调用方法public R CallFunction<T1,T2,R>(string funcName, T1 t1,T2 t2){LuaFunction func = lua.GetFunction(funcName);if (func != null){return func.Invoke<T1,T2,R>(t1,t2);}return default;}//无返回值并且有两个参数的无GC调用方法public void CallFunction<T1, T2>(string funcName, T1 t1, T2 t2){LuaFunction func = lua.GetFunction(funcName);if (func != null){func.Call<T1, T2>(t1, t2);}}

打开Util工具类脚本,找到原始有GC的工具类调用方法
在这里插入图片描述
在这下方我们写两个调用方法封装一下

		/// <summary>/// 执行Lua方法 有GC/// </summary>public static object[] CallMethod(string module, string func, params object[] args){LuaManager luaMgr = AppFacade.Instance.GetManager<LuaManager>(ManagerName.Lua);if (luaMgr == null){Debug.LogError("lua模块“" + module + "”未被找到");return null;}return luaMgr.CallFunction(module + "." + func, args);}//无返回值无GC两个参数的方法public static void NoGCCallMethod<T1, T2>(string module, string func, T1 t1, T2 t2){LuaManager luaMgr = AppFacade.Instance.GetManager<LuaManager>(ManagerName.Lua);if (luaMgr == null){Debug.LogError("lua模块“" + module + "”未被找到");}luaMgr.CallFunction(module + "." + func, t1 ,t2);}//有返回值无GC两个参数的方法public static R InvokeMethod<T1, T2, R>(string module, string func, T1 t1, T2 t2){LuaManager luaMgr = AppFacade.Instance.GetManager<LuaManager>(ManagerName.Lua);if (luaMgr == null){Debug.LogError("lua模块“" + module + "”未被找到");return default;}return luaMgr.CallFunction<T1, T2, R>(module + "." + func, t1, t2);}

用法总结

下面是原始有GC的调用方法和无GC的调用方法,调用参考
在这里插入图片描述

相关文章:

toluaframework中C#怎么调用Lua的方法以及无GC方法

toluaframework中C#怎么调用Lua的方法 问题Util.CallMethodLuaManager.CallFunctionLuaFunction.LazyCall 解决方案LuaFunction脚本无GC消耗的调用 用法总结 问题 用过luaframework框架的人应该都知道框架提供了Util的工具类&#xff0c;工具类提供了一个方法就是Util.CallMet…...

安装pandas报错

报错信息&#xff1a; C:\Users\Jordan>pip install pandas Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple/ Collecting pandasUsing cached https://pypi.tuna.tsinghua.edu.cn/packages/3a/6e/6c9c197ec2da861ea8c9c6848f0f887b7563f16e607bc6a35506af6…...

总有一天,你一定会很棒

晚上从一个大商场吃完饭出来&#xff0c;看到两个垂头丧气的男孩&#xff0c;他们坐在商场门口的户外台阶上&#xff0c;低着头&#xff0c;不停的搓着手&#xff0c;看不见他们的脸&#xff0c;只能看见他们不说话。在他们的面前&#xff0c;是一个年级大约25岁左右的女孩子&a…...

带你深入了解队列(c/cpp双版本模拟实现)

目录 一.队列的概念及结构 二.队列的实现 2.1队列的结构 2.2初始化队列 2.3队尾入队列 2.4队头出队列 2.5获取队列头部元素 2.6获取队列队尾元素 2.7获取队列中有效元素个数 2.8检测队列是否为空 2.9销毁队列 三.C 版本模拟实现队列 一.队列的概念及结构 队列…...

接口自动化测试实操

实现思路 使用excel管理用例用例信息&#xff0c;requests模块发送http请求&#xff0c;实现了记录日志&#xff0c;邮件发送测试报告的功能 目录结构如下&#xff1a; 下面直接上代码&#xff1a; 统筹脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24…...

Virtual DOM

目录 Virtual DOM 前言 用法 代码 理解 Virtual DOM的工作原理&#xff1a; 为什么使用Virtual DOM? 哪些库/框架使用Virtual DOM? 总结 Virtual DOM&#xff08;虚拟DOM&#xff09;是一种编程概念&#xff0c;它是对真实DOM的轻量级抽象表示。在前端开发中&#x…...

数据结构与算法-二叉树的遍历

&#x1f31e; “少年没有乌托邦&#xff0c;心向远方自明朗&#xff01;” 二叉树 &#x1f388;1.二叉树的遍历&#x1f52d;1.1先序遍历&#x1f52d;1.2中序遍历&#x1f52d;1.3后序遍历&#x1f52d;1.4层次遍历&#x1f52d;1.5二叉树遍历的递归算法&#x1f4dd;1.5.1先…...

Qt之普通项目如何生成DLL(含源码+注释)

文章目录 一、示例图二、普通项目需要改造的内容三、源码&#xff08;创建了一个TestDLL的项目&#xff0c;更改内容主要在pro文件和maindow.h文件&#xff09;TestDLL.promainwindow.hmainwindow.cppmainwindow.ui 总结 一、示例图 使用不同的编译模式编译&#xff0c;会在对…...

Java注解及自定义注解

注解/元数据&#xff08;Annotation&#xff09;&#xff0c;是对代码级别的说明&#xff1b;在JDK1.5及以后版本引入的一个特性&#xff0c;与类、接口、枚举是在同一个层次。可以声明在包、类、字段、方法、局部变量、方法参数等的前面&#xff0c;用来对这些元素进行说明、注…...

ps2024滤镜插件Portraiture

Photoshop 是最常用到的综合性的设计工具&#xff0c;虽然PS一直在迭代升级&#xff0c;但是在细节功能上&#xff0c;PS总是无法完全满足全部所有的用户需求&#xff0c;今天coco玛奇朵推荐一个个截至目前最受欢迎的免费的PS插件&#xff0c;有了这些功能扩展的插件后PS如虎添…...

Vue 实战项目(智慧商城项目): 完整的订单购物管理功能 内涵资源代码 基于Vant组件库 Vuex态管理 基于企业级项目开发规范

鹏鹏老师的实战开发项目 文章目录 智慧商城项目01. 项目功能演示1.明确功能模块2.项目收获 02. 项目创建目录初始化vue-cli 建项目 03. 调整初始化目录结构1.删除文件2.修改文件3.新增目录 04. vant组件库及Vue周边的其他组件库05. 全部导入和按需导入的区别06. 全部导入07. 按…...

JVM——一些零散的概念(后续学习深入了再补充)

Native 凡是带了native关键字的&#xff0c;说明Java的作用范围的达不到了&#xff0c;需要调用底层C语言的库 调用native方法&#xff0c;会进入本地方法栈&#xff0c;调用本地接口(JNI) JNI的作用&#xff1a;扩展Java的使用&#xff0c;融合不同的编程语言为Java所用 它在内…...

OpenCV学习(三)——响应鼠标事件(获取点击点坐标和颜色,利用鼠标进行绘图)

响应鼠标事件 3. 响应鼠标事件3.1 获取鼠标点击的坐标3.2 获取鼠标点击像素点的颜色3.3 在鼠标点击的位置生成圆3.4 通过拖动鼠标来绘制填充矩形3.5 通过拖动鼠标绘制未填充矩形3.6 使用鼠标选点绘制多边形3.7 按住鼠标左键进行绘图 3. 响应鼠标事件 使用OpenCV读取图像&#…...

基于安卓android微信小程序的投票系统

项目介绍 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;投票系统小程序被用户普遍使用&#xff0c;为方便用户…...

没有上司的舞会

有了上一篇博客&#xff0c;没有看上一篇博客的可以看看上一篇博客&#xff0c;我们对没有上司的舞会这道题会有更好的理解~ 所以关键的思路就是确定对于每一个节点我们应该维护什么内容才是最合适的&#xff0c;这个题目和上一篇博客的最后一道题目很相似&#xff0c;我们思考…...

2.18每日一题(不直接给f(x)的定积分及变上限积分)

...

RHCE8 资料整理(四)

RHCE8 资料整理 第四篇 存储管理第13章 硬盘管理13.1 对磁盘进行分区13.2 交换分区&#xff08;swap分区&#xff09; 第14章 文件系统14.1 了解文件系统14.2 了解硬链接14.3 创建文件系统14.4 挂载文件系统14.5 设置永久挂载14.6 查找文件14.7 find的用法 第15章 逻辑卷管理15…...

目标跟踪ZoomTrack: Target-aware Non-uniform Resizing for Efficient Visual Tracking

论文作者&#xff1a;Yutong Kou,Jin Gao,Bing Li,Gang Wang,Weiming Hu,Yizheng Wang,Liang Li 作者单位&#xff1a;CASIA; University of Chinese Academy of Sciences; ShanghaiTech University; Beijing Institute of Basic Medical Sciences; People AI, Inc 论文链接&…...

Flink Data Sink

本专栏案例代码和数据集链接: https://download.csdn.net/download/shangjg03/88477960 1. Data Sinks 在使用 Flink 进行数据处理时,数据经 Data Source 流入,然后通过系列 Transformations 的转化,最终可以通过 Sink 将计算结果进行输出,Flink Data Sinks 就是用于定义…...

机器学习——正则化

正则化 在机器学习学习中往往不知道需要不知道选取的特征个数&#xff0c;假如特征个数选取过少&#xff0c;容易造成欠拟合&#xff0c;特征个数选取过多&#xff0c;则容易造成过拟合。由此为了保证模型能够很好的拟合样本&#xff0c;同时为了不要出现过拟合现象&#xff0…...

开源婚礼技能库:用项目管理思维破解备婚焦虑,打造个性化高性价比婚礼

1. 项目概述&#xff1a;婚礼技能库的诞生与价值最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“awesome-wedding-skills”。光看名字&#xff0c;你可能会觉得这又是一个普通的“awesome”系列资源列表&#xff0c;无非是收集一些婚礼策划、摄影、化妆的链接。但当我点…...

基于Databerry的私有数据AI应用构建:从RAG原理到生产部署

1. 项目概述&#xff1a;一个开箱即用的AI应用构建平台如果你正在寻找一个能快速将私有数据&#xff08;比如公司文档、个人笔记、产品手册&#xff09;转化为智能问答机器人的工具&#xff0c;但又不想从零开始折腾复杂的向量数据库、嵌入模型和API集成&#xff0c;那么gmpetr…...

Node.js代理池实战:proxy-agents库核心原理与高级应用

1. 项目概述与核心价值最近在折腾一些需要处理大量网络请求的自动化脚本&#xff0c;比如数据采集、API测试或者模拟用户操作&#xff0c;一个绕不开的痛点就是IP被封。单个IP频繁请求&#xff0c;对方服务器很容易就把你拉黑了。这时候&#xff0c;代理池就成了刚需。市面上成…...

为AI智能体设计的任务管理后端:构建标准化、机器友好的任务元模型

1. 项目概述&#xff1a;一个为AI而生的待办清单最近在折腾各种AI工具链和自动化流程时&#xff0c;我遇到了一个挺普遍的问题&#xff1a;如何让AI助手&#xff0c;比如ChatGPT、Claude或者本地部署的大语言模型&#xff0c;更好地理解并管理我手头一堆零散、动态的任务&#…...

SQL学习指南——背景知识

关系型数据库中每个数据表都包含能够唯一标识某一行的信息&#xff08;称为主键 primary key&#xff09;&#xff0c;以及完整描述实体所需的额外信息 一些数据表中还包含了导航到其他数据表的信息&#xff0c;这些列称为外键&#xff08;foreign key) 术语术语定义实体数据库…...

从“客户匿名”到“可验证”:技术服务案例的工程化写法

在撰写技术服务案例时&#xff0c;我们经常面临一个挑战&#xff1a;客户要求匿名&#xff0c;但案例又需要让潜在客户相信效果。如何平衡&#xff1f;结合文澜天下科技在AI搜索优化项目中的实践&#xff0c;分享一种“可验证”的案例写法。一、定位具体行业和场景 不写“某教育…...

3分钟快速上手:m4s-converter让B站缓存视频秒变MP4格式

3分钟快速上手&#xff1a;m4s-converter让B站缓存视频秒变MP4格式 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 在当今数字内容时代&#xff…...

深度神经网络参数安全与Hessian-aware训练防御技术

1. 深度神经网络参数安全威胁现状深度神经网络(DNN)在内存中的参数面临着严重的比特翻转安全威胁。这种威胁主要来自两个方面&#xff1a;自然发生的硬件故障和人为发起的攻击行为。在IEEE-754 32位浮点数表示中&#xff0c;一个比特的翻转可能导致参数值发生灾难性变化。例如&…...

RK3288嵌入式开发实战:硬件架构、软件定制与典型应用场景解析

1. 项目概述&#xff1a;为什么RK3288至今仍是嵌入式开发的“硬通货”&#xff1f; 在嵌入式开发这个行当里&#xff0c;选型是个技术活&#xff0c;更是个经验活。你既要考虑当下的性能需求&#xff0c;又要掂量未来的扩展可能&#xff0c;还得平衡成本、功耗和开发周期。从业…...

Harness 中的请求标识染色:端到端追踪

1. 标题选项(核心关键词:Harness、请求标识染色、端到端追踪、可观测性、CI/CD) 「Harness 可观测性实战:请求标识染色实现全链路端到端追踪」 「从0到1搞定Harness请求染色:让微服务调用链路+变更链路无所遁形」 「告别排查黑洞:Harness请求标识染色的端到端追踪落地指南…...