lua 函数 默认值_Unity热更新框架之xLua

2023-10-29

一:xLua概述

二:Lua文件加载

三:xLua文件配置

四:Lua与C#交互

五:xLua热更新

一:xLua概述

1.1 xLua简介

xLua是由腾讯维护的一个开源项目,xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。自2016年初推广以来,已经应用于十多款腾讯自研游戏,因其良好性能、易用性、扩展性而广受好评。现在,腾讯已经将xLua开源到GitHub。其git地址是:https://github.com/Tencent/xLua。

xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是:可以运行时把C#实现(方法,操作符,属性,事件等等)替换成lua实现;

出色的GC优化,自定义struct,枚举在Lua和C#间传递无C# gc alloc;

编辑器下无需生成代码,开发更轻量;

除此之外,xLua另一特色功能就是代码热补丁。非常适合前期没有规划使用Lua进行逻辑开发,后期又需要在iOS这种平台获得代码热更新能力的项目。

1.2 xLua安装

1:首先下载最新版xLua ,然后解压到你想解压到的位置;

2:工程打开后,你将会看到一个Assets目录,这目录就对应Unity工程的Assets目录,保持这目录结构放到你的Unity工程即可;

4:xLua API可参见链接:

二:Lua文件加载

2.1 执行字符串

最基本是直接用LuaEnv.DoString执行一个字符串,当然,字符串得符合Lua语法

比如:luaenv.DoString("print('hello world')")

完整代码见XLua\Tutorial\LoadLuaScript\ByString目录。

但这种方式并不建议,更建议下面介绍这种方法。

2.2 加载Lua文件

用lua的require函数即可,比如:DoString(“require 'byfile'")

require实际上是调一个个的loader去加载,有一个成功就不再往下尝试,全失败则报文件找不到。

完整代码见XLua\Tutorial\LoadLuaScript\ByFile目录。

2.3 自定义loader

在xLua加自定义loader是很简单的,只涉及到一个接口:

public delegate byte[] CustomLoader(ref string filepath);

public void LuaEnv.AddLoader(CustomLoader loader);

通过AddLoader可以注册个回调,该回调参数是字符串,lua代码里头调用require时,参数将会透传给回调,回调中就可以根据这个参数去加载指定文件,如果需要支持调试,需要把filepath修改为真实路径传出。该回调返回值是一个byte数组,如果为空表示该loader找不到,否则则为lua文件的内容。

有了这个就简单了,用IIPS的IFS?没问题。写个loader调用IIPS的接口读文件内容即可。文件已经加密?没问题,自己写loader读取文件解密后返回即可。

完整示例见XLua\Tutorial\LoadLuaScript\Loader。

三:xLua文件配置

xLua所有的配置都支持三种方式:打标签;静态列表;动态列表。

3.1 打标签

xLua用白名单来指明生成哪些代码,而白名单通过attribute来配置,比如你想从lua

调用c#的某个类,希望生成适配代码,你可以为这个类型打一个LuaCallCSharp标签:

该方式方便,但在il2cpp下会增加不少的代码量,不建议使用。

常用标签如下所示:

1、[XLua.LuaCallCSharp]:为一个C#类型加了这个配置,xLua会生成这个类型的适配代码(否则将会尝试用性能较低的反射方式来访问),提供给Lua调用。

2、[XLua.CSharpCallLua]:如果希望Lua文件中的逻辑能够被C#调用,可为Lua重的函数等打上该标签。

3、[XLua.Hotfix]:用于标记需要进行热更新的文件。

3.2 静态列表

有时我们无法直接给一个类型打标签,比如系统api,没源码的库,或者实例化的泛化类型,这时你可以在一个静态类里声明一个静态字段,该字段的类型除BlackList和AdditionalProperties之外只要实现了IEnumerable就可以了,然后为这字段加上标签:

这个字段需要放到一个 静态类 里头,建议放到 Editor目录 。

3.3 动态列表

声明一个静态属性,打上相应的标签即可。

Getter是代码,你可以实现很多效果,比如按命名空间配置,按程序集配置等等。

这个属性需要放到一个 静态类 里头,建议放到 Editor目录。

四:Lua与C#交互

4.1 C#访问Lua

4.1.1 获取一个全局基本数据类型

访问LuaEnv.Global就可以了,上面有个模版Get方法,可指定返回的类型。

luaenv.Global.Get("a")

luaenv.Global.Get("b")

luaenv.Global.Get("c")

4.1.2 访问一个全局的table

1、映射到普通class或struct

定义一个class,有对应于table的字段的public属性,而且有无参数构造函数即可,比如对于{f1 = 100, f2 = 100}可以定义一个包含public int f1;public int f2;的class。这种方式下xLua会帮你new一个实例,并把对应的字段赋值过去。table的属性可以多于或者少于class的属性。可以嵌套其它复杂类型。

要注意的是,这个过程是值拷贝,如果class比较复杂代价会比较大。而且修改class的字段值不会同步到table,反过来也不会。这个功能可以通过把类型加到GCOptimize生成降低开销。

2、映射到一个interface

这种方式依赖于生成代码(如果没生成代码会抛InvalidCastException异常),代码生成器会生成这个interface的实例,如果get一个属性,生成代码会get对应的table字段,如果set属性也会设置对应的字段。甚至可以通过interface的方法访问lua的函数。

3、更轻量级的by value方式:映射到Dictionary<>,List<>

不想定义class或者interface的话,可以考虑用这个,前提table下key和value的类型都是一致的。

4、另外一种by ref方式:映射到LuaTable类

这种方式好处是不需要生成代码,但也有一些问题,比如慢,比方式2要慢一个数量级,比如没有类型检查。

4.1.3 访问一个全局的function

1、映射到delegate

这种是建议的方式,性能好很多,而且类型安全。缺点是要生成代码(如果没生成代码会抛InvalidCastException异常)。

delegate要怎样声明呢?

对于function的每个参数就声明一个输入类型的参数。

多返回值要怎么处理?从左往右映射到c#的输出参数,输出参数包括返回值,out参数,ref参数。

参数、返回值类型支持哪些呢?都支持,各种复杂类型,out,ref修饰的,甚至可以返回另外一个delegate。

delegate的使用就更简单了,直接像个函数那样用就可以了。

2、映射到LuaFunction

这种方式的优缺点刚好和第一种相反。

使用也简单,LuaFunction上有个变参的Call函数,可以传任意类型,任意个数的参数,返回值是object的数组,对应于lua的多返回值。

4.2 Lua调用C#

4.2.1 new C#对象

在C#这样new一个对象:

var newGameObj = new UnityEngine.GameObject();

对应到Lua是这样:

local newGameObj = CS.UnityEngine.GameObject()

基本类似,除了:

lua里头没有new关键字;

所有C#相关的都放到CS下,包括构造函数,静态成员属性、方法;

如果有多个构造函数呢?放心,xlua支持重载,比如你要调用GameObject的带一个string参数的构造函数,这么写:

local newGameObj2 = CS.UnityEngine.GameObject('helloworld')

4.2.2 访问C#静态属性,方法

读静态属性

CS.UnityEngine.Time.deltaTime

写静态属性

CS.UnityEngine.Time.timeScale = 0.5

调用静态方法

CS.UnityEngine.GameObject.Find('helloworld')

小技巧:如果需要经常访问的类,可以先用局部变量引用后访问,除了减少敲代码的时间,还能提高性能:

local GameObject = CS.UnityEngine.GameObject

GameObject.Find('helloworld')

4.2.3 访问C#成员属性,方法

读成员属性

testobj.DMF

写成员属性

testobj.DMF = 1024

调用成员方法

注意:调用成员方法,第一个参数需要传该对象,建议用冒号语法糖,如下

testobj:DMFunc()

4.2.4 访问父类属性,方法

xlua支持(通过派生类)访问基类的静态属性,静态方法,(通过派生类实例)访问基

类的成员属性,成员方法。

4.2.5 参数的输入输出属性(out,ref)

Lua调用测的参数处理规则:C#的普通参数算一个输入形参,ref修饰的算一个输入形参

out修饰的不算,然后从左往右对应lua 调用测的实参列表;

Lua调用测的返回值处理规则:C#函数的返回值(如果有的话)算一个返回值,out算一个返回值,ref算一个返回值,然后从左往右对应lua的多返回值。

4.2.6 重载方法

直接通过不同的参数类型进行重载函数的访问,例如:

testobj:TestFunc(100)

testobj:TestFunc('hello')

将分别访问整数参数的TestFunc和字符串参数的TestFunc。

注意:xlua只一定程度上支持重载函数的调用,因为lua的类型远远不如C#丰富,存在一

对多的情况,比如C#的int,float,double都对应于lua的number,上面的例子中

TestFunc如果有这些重载参数,第一行将无法区分开来,只能调用到其中一个(生成代码

中排前面的那个)。

4.2.7 操作符

支持的操作符有:+,-,*,/,==,一元 -,

4.2.8 参数带默认值的方法

和C#调用有默认值参数的函数一样,如果所给的实参少于形参,则会用默认值补上。

4.2.9 可变参数方法

对于C#的如下方法:

void VariableParamsFunc(int a, params string[] strs)

可以在lua里头这样调用:

testobj:VariableParamsFunc(5, 'hello', 'john')

4.2.10 使用Extension methods

在C#里定义了,lua里就能直接使用。

4.2.11 泛化(模版)方法

不直接支持,可以通过Extension methods功能进行封装后调用。

4.2.12 枚举类型

枚举值就像枚举类型下的静态属性一样。

testobj:EnumTestFunc(CS.Tutorial.TestEnum.E1)

上面的EnumTestFunc函数参数是Tutorial.TestEnum类型的

另外,如果枚举类加入到生成代码的话,枚举类将支持__CastFrom方法,可以实现从一个整数或者字符串到枚举值的转换,例如:

CS.Tutorial.TestEnum.__CastFrom(1)

CS.Tutorial.TestEnum.__CastFrom(‘E1')

4.2.13 delegate使用(调用,+,-)

C#的delegate调用:和调用普通lua函数一样

+操作符:对应C#的+操作符,把两个调用串成一个调用链,右操作数可以是同类型的

C#delegate或者是lua函数。

-操作符:和+相反,把一个delegate从调用链中移除。

Ps:delegate属性可以用一个luafunction来赋值。

4.2.14 event

比如testobj里头有个事件定义是这样:public event Action TestEvent;

增加事件回调

testobj:TestEvent('+', lua_event_callback)

移除事件回调

testobj:TestEvent('-', lua_event_callback)

4.2.15 C#复杂类型和table的自动转换

对于一个有无参构造函数的C#复杂类型,在lua侧可以直接用一个table来代替,该table对应复杂类型的public字段有相应字段即可,支持函数参数传递,属性赋值等,例如:

C#下B结构体(class也支持)定义如下:

public struct A{ public int a;}

public struct B{ public A b; public double c;}

某个类有成员函数如下:void Foo(B b)

在lua可以这么调用:

obj:Foo({b = {a = 100}, c = 200})

获取类型(相当于C#的typeof)

比如要获取UnityEngine.ParticleSystem类的Type信息,可以这样

typeof(CS.UnityEngine.ParticleSystem)。

4.2.16 “强”转

lua没类型,所以不会有强类型语言的“强转”,但有个有点像的东西:告诉xlua要用指定的生成代码去调用一个对象,这在什么情况下能用到呢?有的时候第三方库对外暴露的是一个interface或者抽象类,实现类是隐藏的,这样我们无法对实现类进行代码生成。该实现类将会被xlua识别为未生成代码而用反射来访问,如果这个调用是很频繁的话还是很影响性能的,这时我们就可以把这个interface或者抽象类加到生成代码,然后指定用该生成代码来访问:

cast(calc, typeof(CS.Tutorial.Calc))

上面就是指定用CS.Tutorial.Calc的生成代码来访问calc对象。

4.2.17 C#与Lua交互原理

1、C#调用Lua:C#先调用Lua的dll文件(C语言写的库),dll文件执行Lua代码

2、Lua调用C#:

1、Wrap方式:非反射机制,需要为源文件生成相应的wrap文件,当启动

Lua虚拟机时,Wrap文件将会被自动注册到Lua虚拟机中,之后,Lua文件

将能够识别和调用C#源文件。

总结:Lua调用Wrap文件, Wrap文件调用C#源文件

2、反射机制

五:xLua热更新

5.1 使用方式

1、添加HOTFIX_ENABLE宏打开该特性(在Unity3D的File->Build Setting->Scripting Define Symbols下添加)。编辑器、各手机平台这个宏要分别设置!如果是自动化打包,要注意在代码里头用API设置的宏是不生效的,需要在编辑器设置。

(建议平时开发业务代码不打开HOTFIX_ENABLE,只在build手机版本或者要在编译器下开发补丁时打开HOTFIX_ENABLE)

2、执行XLua/Generate Code菜单。

3、注入,构建手机包这个步骤会在构建时自动进行,编辑器下开发补丁需要手动执行"XLua/Hotfix Inject In Editor"菜单。注入成功会打印“hotfix inject finish!”或者“had injected!”。

5.2 约束

不支持静态构造函数,目前只支持Assets下代码的热补丁,不支持引擎,c#系统库的热补丁。

5.3 API

(1)xlua.hotfix(class, [method_name], fix)描述 : 注入lua补丁

class : C#类,两种表示方法,CS.Namespace.TypeName或者字符串方式"Namespace.TypeName",字符串格式和C#的Type.GetType要求一致,如果是内嵌类型(Nested Type)是非Public类型的话,只能用字符串方式表示"Namespace.TypeName+NestedTypeName";

method_name : 方法名,可选;

fix : 如果传了method_name,fix将会是一个function,否则通过table提供一组函数。table的组织按key是method_name,value是function的方式。

base(csobj)描述 : 子类override函数通过base调用父类实现。

csobj : 对象

返回值 : 新对象,可以通过该对象base上的方法

(2)util.hotfix_ex(class, method_name, fix)描述 : xlua.hotfix的增强版本,可以在fix函数里头执行原来的函数,缺点是fix的执行会略慢。

method_name : 方法名;

fix : 用来替换C#方法的lua function。

5.4 Hotfix Flag

Hotfix标签可以设置一些标志位对生成代码及插桩定制化。Stateless、Stateful

遗留设置,Stateful方式在新版本已经删除,因为这种方式可以用xlua.util.hotfix_state接口达到类似的效果。ValueTypeBoxing

值类型的适配delegate会收敛到object,好处是代码量更少,不好的是值类型会产生boxing及gc,适用于对text段敏感的业务。IgnoreProperty

不对属性注入及生成适配代码,一般而言,大多数属性的实现都很简单,出错几率比较小,建议不注入。IgnoreNotPublic

不对非public的方法注入及生成适配代码。除了像MonoBehaviour那种会被反射调用的私有方法必须得注入,其它仅被本类调用的非public方法可以不注入,只不过修复时会工作量稍大,所有引用到这个函数的public方法都要重写。Inline

不生成适配delegate,直接在函数体注入处理代码。IntKey

不生成静态字段,而是把所有注入点放到一个数组集中管理。

5.5 使用建议对所有较大可能变动的类型加上Hotfix标识;

建议用反射找出所有函数参数、字段、属性、事件涉及的delegate类型,标注CSharpCallLua;

业务代码、引擎API、系统API,需要在Lua补丁里头高性能访问的类型,加上

LuaCallCSharp引擎API、系统API可能被代码剪裁调(C#无引用的地方都会被剪裁),如果觉得可能会

新增C#代码之外的API调用,这些API所在的类型要么加LuaCallCSharp,要么ReflectionUse;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lua 函数 默认值_Unity热更新框架之xLua 的相关文章

  • GLSL中Uniform块

    Uniform块 当着色器程序变复杂时 用到的uniform变量数量也会上升 通常会在多个着色器程序中用到同一个uniform变量 由于uniform变量的位置是着色器链接的时候产生的 也就是glLinkProgram 的时候 因此它在应用
  • SQL新用户留存分析

    表 用户登录日期区间表 dws app user act rng 2020 09 04 前一天 其中9999 12 31代表计算当天也登录过 用户日活表 dws app trf agr user 2020 09 05 新一天 需求 求出用户
  • 【2022最新Java面试宝典】—— ZooKeeper面试题(28道含答案)

    目录 1 ZooKeeper 是什么 2 ZooKeeper 提供了什么 3 Zookeeper 文件系统 4 ZAB 协议 5 四种类型的数据节点 Znode 6 Zookeeper Watcher 机制 数据变更通知 7 客户端注册 W
  • sublime搭建C/C++编译环境(超完美的配置并配上内容详细讲解!!)

    sublime搭建C C 编译环境 超完美的配置并配上内容详细讲解
  • 证书服务 笔记

    1 www verisign com www ssl com www godaddy com www wosign com 2 转载于 https www cnblogs com emmagikyo p 5292820 html
  • Unexpected token o in JSON at position 1 报错原因及解决方法

    Unexpected token o in JSON at position 1 报错原因及解决方 问题描述 在做登录页面 实现登录功能 返回token值时 提示 Unexpected token o in JSON at position
  • Burst(突发)信号详解

    突发信号是一个根据字面意思非常难以理解的信号 为此头疼了好久 终于理解了什么是突发信号 突发是指在同一行中相邻的存储单元连续进行数据传输的方式 连续传输所涉及到存储单元 列 的数量就是突发长度 SDRAM 简称BL burst length
  • EQ均衡器原理

    做音乐最离不开的效果器是什么 相信大多数朋友都会回答 是EQ 不错 正是有了这个所谓 均衡 的效果器 我们的音乐才不会过载 乐器音色才会如此丰富 然而知道1加1等于2更要知道1加1为什么等于2 今天我把这个效果器扒光 从根本上来分析它的工作
  • my-innodb-heavy-4G.cnf配置文件详解

    client 客户端 port 3306 客户端连接端口 socket tmp mysql sock 客户端套接字文件的路径 mysqld port 3306 服务器监听端口 socket tmp mysql sock 服务器套接字文件的路
  • 做自动化测试可选择的工具有哪些?

    如今 作为一名软件测试工程师 几乎所有人都需要具备自动化测试相关的知识 并且懂得如何去利用工具 来为企业减少时间成本和错误成本 这是为什么呢 在以前 会测试人员一般都只需要扮演终端用户 会做手动测试用例并记录观察结果就足够了 但如今 一旦你
  • QT中connect函数中的lambda表达式关于局部变量的按值拷贝与按引用拷贝,以及mutable关键字

    1 当lambda表达式中使用 时 为按值拷贝作用范围的局部变量 默认不可修改按值传进来的拷贝 如图 不加mutable时报错 a不可改变 加mutable后可以改变a值 但是时修改的拷贝对象 connect上边的a值未修改 include
  • Spring Boot 3.0 (十四): Spring Boot 整合 Shiro安全框架

    官方暂时还没有适配 Spring Boot 3 X 这篇文章我们来学习如何使用 Spring Boot 集成 Apache Shiro 安全应该是互联网公司的一道生命线 几乎任何的公司都会涉及到这方面的需求 在 Java 领域一般有 Spr
  • wxc-progress使用

  • docker 安装gitlab

    https www cnblogs com zuxing articles 9329152 html
  • C语言中输出string方法c_str()用法

    今天突然用printf s str str 是一个string 的时候突然出现乱码 就查了一下为什么 任何时候只有自己敲代码的时候才能发现 可以用cout lt
  • 智慧节能照明系统的八大应用场景

    节能 作为社会经济发展的主旋律 在生产生活的方面都要积极实践 照明是首当其冲需要进行节能升级的 智慧节能照明系统解决方案 基于电力网络 以物联网 自动化控制 无线通讯等技术 结合智能化物联网设备 实现对照明系统的集中 定时 模式等多样化控制
  • xcode编译代码的时候 ld: library not found for -xxx 解决方法

    有时候在Xcode下面我们需要引入第三方类库 或者自己写的静态库 如果配置不正确 就会出现如下错误 ld library not found for lpcre clang error linker command failed with
  • Redis:实现全局唯一ID

    Redis 实现全局唯一ID 一 概述 二 实现 1 获取初始时间戳 2 生成全局ID 三 测试 为什么可以实现全局唯一 其他唯一ID策略 补充 countDownLatch 一 概述 全局ID生成器 是一种在 分布式系统下 用来生成全局唯
  • 来 Azure 学习 OpenAI 四 - 用 Embedding 赋能 GPT

    大家好 我是学生大使 Jambo 在我们前一篇文章中 我们介绍了 OpenAI 模型的调用 今天 我将为大家介绍 Embedding 的使用 嵌入是什么 嵌入 Embedding 是一种将高维数据映射到低维空间的方法 嵌入可以将高维数据可视

随机推荐

  • HTTP介绍:一文了解什么是HTTP

    前言 在当今数字时代 互联网已经成为人们生活中不可或缺的一部分 无论是浏览网页 发送电子邮件还是在线购物 我们都离不开超文本传输协议 HTTP HTTP作为一种通信协议 扮演着连接客户端和服务器的重要角色 它不仅仅是一种简单的传输协议 更是
  • OSS/J即将获得飞速发展

    软件集成已经是运营商不得不面对的大问题了 数目众多的独立软件公司所提供的应用程序接口互不兼容所引发的互通性问题正使运营商焦头烂额 这也就是为什么基于Java技术的OSS OSS J 正在越来越得到重视的原因 OSS J推出的初衷是源于企业采
  • iostat 命令查看io信息

    在使用htop命令的时候会看到这么一行 翻译一下 us 用户态使用的cpu时间比 sy 系统态使用的cpu时间比 ni 用做nice加权的进程分配的用户态cpu时间比 id 空闲的cpu时间比 wa cpu等待磁盘写入完成时间 hi 硬中断
  • 大厂年薪30W+数据分析师学习路线,实用到哭!会Python的更有优势!

    不知道大家发现没 近几年 国内对数据分析类人才需求越来越大了 这点从国家开始批准大学设立数据分析相关专业就能看出来 2016年2月 教育部公布新增 数据科学与大数据技术 专业 北京大学 对外经济贸易大学 中南大学成为首家获批高校 后来又有中
  • 常用Shell命令汇总-vim

    不知道大家平时有没有跟我一样的感受 就是很多shell命令自己其实用过 但时间一久又忘记了 导致又要到处百度 开始写这个系列的目的第一是为了总结 第二是为了以后忘记时可以直接到这找哈哈哈哈哈 平时在百度时还发现一个问题 就是其实我只想要最常
  • 怎么看服务器的token信息,token查看

    token查看 内容精选 换一换 本章节通过示例演示如何调用API来删除负载均衡器 删除负载均衡器时 需要逐个删除负载均衡器下的资源 负载均衡器关联的资源如图1 包括监听器 转发策略 后端服务器组 健康检查和后端服务器 当您使用Token认
  • C/C++ 全局变量初始化

    C语言全局变量只能用常量表达式初始化 不能用一个数学函数或者其他的需要在运行时才能计算出结果的表达式进行初始化 C 标准 全局变量的初始化要在 main 函数执行前完成 常识无疑 但是这个说法有点含糊 main 函数执行前到底具体是什么时候
  • 超级厉害的汇总图——人工智能之机器学习算法体系

    1 人工智能之机器学习体系汇总 直接上干货 此处梳理出面向人工智能的机器学习方法体系 主要体现机器学习方法和逻辑关系 理清机器学习脉络 后续文章会针对机器学习系列讲解算法原理和实战 抱着一颗严谨学习之心 有不当之处欢迎斧正 2 人工智能相关
  • (Struts2学习篇) Struts2数据校验之二

    struts2数据校验的方法 1 validateXxx方法验证 validate多业务action方法的验证 如果业务验证方法不止一个则可以使用validateXXX 来验证 在struts xml配置方法调用 span style fo
  • OSI与TCP/IP的区别

    OSI的概念 Open System Interconnect开放系统互连参考模型 是由ISO 国际标准化组织 定义的 它是个灵活的 稳健的和可互操作的模型 并不是协 议 常用来分析和设计网络体系结构 OSI模型分为七层 OSI把网络按照层
  • 身份识别与访问管理(IAM)

    身份识别与访问管理 IAM Identity and Access Management 参考文章 涨知识 认识IAM 向着 零信任 安全架构迈进 什么是身份和访问管理 IAM IAM 身份识别与访问管理 简称大4A 百度百科 身份访问与管
  • EDA第一次课<1117电路图的绘制>

    EDA第一次课 lt 1117电路图的绘制 gt 电路图1117 我们把需要用到的元器件先列出来 PWR2 5 1 GND 3 RES2 4 LED0 2 VCC 1 双刀双掷开关 1 自制元器件 黄框框 1 绘制1117 1 首先我们打开
  • 【自然语言处理】关系抽取 —— CoIn 讲解

    CoIn 论文信息 标题 Consistent Inference for Dialogue Relation Extraction 作者 Xinwei Long Shuzi Niu Yucheng Li 期刊 IJCAI 2021 主题
  • Golang 结构化日志包 log/slog 详解(三):属性字段和日志级别

    上一篇文章讲解了 log slog 包中的 Handler 的使用方法 通过不同的 Handler 可以输出不同格式的日志 接下来看一下如何自定义日志的属性字段和日志级别 属性字段 attribute 许多日志都有一些通用的的字段 例如日志
  • [每日一氵]Latex 的通讯作者怎么搞

    之前看文章 通讯作者都是默认放在最后一个位置 然后用十字或者双十字标注上 今天看到这个模板的通讯作者 还是这个好看 机构 标题都是我瞎编的 title Rethinking the eyes Problem in Game author D
  • 安装完华为的opengauss 后,能ping通服务地址,telnet不通端口

    一 事件起因 安装完华为的openGauss 后 能ping通服务的地址 telnet不通端口 linux服务本机可以用gsql客户端访问 但是外部用 Data Studio 或者 Navicat 进行连接时 连接服务失败 利用 cmd 进
  • 大牛深入讲解!最经典的HashMap图文详解

    栈和队列部分 10 设计一个有getMin功能的栈 士 由两个栈组成的队列 尉 如何仅用递归函数和栈操作逆序一个栈 尉 猫狗队列 士 用一个栈实现另一个栈的排序 士 用栈来求解汉诺塔问题 校 生成窗口最大值数组 尉 构造数组的MaxTree
  • AStyle.exe -h的完整内容,方便配置时查阅

    AStyle exe h Artistic Style 3 1 Maintained by Jim Pattee Original Author Tal Davidson Usage astyle OPTIONS File1 File2 F
  • 如何剪辑一个好的短视频?教你一个小技巧,剪辑视频很简单

    短视频现在越来越受到大众喜欢 不管是老人 小孩 年轻人都会在有空余时间刷下短视频 不知不觉得短视频已形成人们平时生活中一部分 那么要如何剪辑一个好的短视频 制作短视频可以分成两个部分 第一部分就是选题再拍一个短视频这个一般都很容易操作的 第
  • lua 函数 默认值_Unity热更新框架之xLua

    一 xLua概述 二 Lua文件加载 三 xLua文件配置 四 Lua与C 交互 五 xLua热更新 一 xLua概述 1 1 xLua简介 xLua是由腾讯维护的一个开源项目 xLua为Unity Net Mono等C 环境增加Lua脚本