xlua 运行原理

devtools/2025/3/17 13:42:08/
  1. iOS限制App的二进制代码要一次性的包含在App内,也就是AOT,不支持JIT
  2. Lua代码作为资源文件,玩家下载,不涉及字节码,所以可以做热更
  3. Lua代码通过Lua虚拟机解释执行(解释成机器码),并在虚拟机内部管理变量,使用的是LuaVM
  4. Lua虚拟机比如Lua5.3、Lua5.2 由c语言编写,在android下编译成.so文件、iOS下编译成.a文件,内置到包里面
    1. 在Android开发中,`.so`文件也是动态链接库文件,通常用于包含用C或C++编写的本地代码。这些文件是通过Android NDK(Native Development Kit)生成的,允许开发者在应用中使用高性能的本地代码。
  5. XLua通过Wrap文件实现Lua调用C#,原理就是把C#函数压入堆栈,让Lua执行

Wrap 文件的执行原理

注册阶段:Lua虚拟机启动时
  • 触发时机‌:在App启动过程中,‌首次初始化Lua虚拟机‌(如调用new LuaEnv())时,执行LuaBinder.Bind()方法,加载所有Wrap文件的注册逻辑‌。
  • 核心步骤‌:
    1. Wrap文件中的Register()方法被调用,通过LuaState.BeginClass()LuaState.RegFunction()等接口,将C#类的方法、属性映射到Lua虚拟机的全局表中‌。
    2. C#方法被转换为Lua可识别的函数指针,并压入Lua虚拟栈,完成Lua层对C#方法的绑定‌。

执行示例

以UnityEngine_GameObjectWrap.cs为例:

  • 注册逻辑‌:在Register()方法中,调用L.RegFunction("SetActive", SetActive),将C#的GameObject.SetActive()方法映射为Lua中的SetActive函数‌。
  • 结果‌:Lua虚拟机启动后,Lua脚本可直接通过CS.UnityEngine.GameObject.SetActive()调用C#原生方法‌。

参考:C C++ 为什么称为Native代码、虚拟机-CSDN博客

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

相关文章

学习TensorFlow前的NumPy核心知识点

学习TensorFlow前的NumPy核心知识点 一、数组创建与属性 数组创建 核心方法:使用np.array()、np.zeros()、np.ones()、np.arange()、np.linspace()创建数组。 import numpy as np# 创建一维数组 arr1 np.array([1, 2, 3])# 创建全零二维数组 zeros_arr np.zer…

PyTorch分布式训练

本文结构: 分布式训练概述环境设置数据并行(DDP)模型并行启动训练性能优化建议示例代码参考资料和相关问题 以下是为您整理的PyTorch分布式训练教程指南: 一、PyTorch分布式训练核心概念 数据并行:通过分割数据集实…

基于javaweb的SpringBoot博客商城管理系统设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

如何把绿色可执行应用程序添加到Ubuntu的收藏夹Dock中

解决办法: 对于安装的程序来说,当你运行程序以后,在收藏夹上右键该图标就可以勾选“添加到收藏夹”中,这样程序就固定到收藏夹上了;但是对于绿色可执行应用程序来说,无法这样操作。可参考如下操作步骤&…

使用 AJAX 前后端传递数据

使用异步操作(ajax)前后端传递数据 1、传递对象 1.1、jsp文件 <% page language"java"pageEncoding"UTF-8" isELIgnored"false"%><html> <meta charset"UTF-8"> <%--${pageContext.request.contextPath}&#…

打靶练习-W1R3S、JARBAS、SickOS、Prime

W1R3S(思路为主) 信息收集 首先使用nmap探测主机&#xff0c;得到192.168.190.147 接下来扫描端口&#xff0c;可以看到ports文件保存了三种格式 其中.nmap和屏幕输出的一样&#xff1b;xml这种的适合机器 nmap -sT --min-rate 10000 -p- 192.168.190.147 -oA nmapscan/ports…

计算机毕业设计:饮品在线点单与管理系统

​​​饮品在线点单与管理系统mysql数据库创建语句 饮品在线点单与管理系统oracle数据库创建语句饮品在线点单与管理系统sqlserver数据库创建语句饮品在线点单与管理系统springspringMVChibernate框架对象(javaBean,pojo)设计饮品在线点单与管理系统springspringMVCmybatis框架…

线程 —— 定时器

什么是定时器 定时器是软件开发中的一个重要组件&#xff0c;类似于一个“闹钟”。达到一个设定的时间之后&#xff0c;就执行某个指定好的代码。 标准库中的定时器 标准库中提供了一个 Timer 类。Timer 类的核心方法为 schedule。schedule 包含两个参数。第一个参数指定即将…