xlua源码分析
文章平均质量分 93
异次元的归来
Game_Develop_Forever
展开
-
xlua源码分析(六) C#与lua的交互总结
我们分析了xlua对struct类型所做的优化,本节我们系统性地梳理一下xlua中C#与lua的交互。所谓C#与lua的交互,其实主要就分为两部分,第一是往lua层中传数据,第二则是从lua层中取数据。原创 2024-02-21 23:54:17 · 843 阅读 · 0 评论 -
xlua源码分析(五) struct类型优化
而数据传输的逻辑,稍微不太相同,tolua是使用lua函数进行数据传输,例如Vector3,tolua可以通过一个get函数直接返回3个float*给C#层,也可以通过一个new函数直接使用x,y,z三个参数构造出一个lua层的struct,pack和unpack的逻辑都放在了lua层里。函数是在C层实现的,那其实很简单了,就是把userdata作为要访问内存的首地址,加上偏移量offset,执行memcpy即可,如果是get,就是从userdata拷贝到value,再push到lua栈;原创 2024-01-15 21:03:01 · 1130 阅读 · 0 评论 -
xlua源码分析(四) lua访问C#的值类型
与tolua相比,两者都实现了无gc的值类型传递。而tolua的值类型,默认会在lua层实现一份类似的代码,lua层在调用时,完全是走的lua层的逻辑,不会涉及拷贝数据到C#层的逻辑,只有作为函数调用参数和返回值时,才涉及到数据的拷贝。这样做的好处,就是避免了在函数调用过程的频繁的数据拷贝开销,不方便的地方就是需要在lua层自己实现一遍C#的值类型,而使用wrap则只需要自动生成代码即可,没有额外的开发负担。比如这里,把一个C#对象push到lua层,意味着lua层需要知道对象的类型id,也就是C#层的。原创 2023-12-25 23:37:53 · 495 阅读 · 0 评论 -
xlua源码分析(三)C#访问lua的映射
XLuaTestInvokeLuaICalcBridge是继承自ICalc接口的类,它负责实现ICalc的功能,也就是我们一开始提到的一个PropertyChanged的event +=和-=操作,一个Add方法,一个Multi属性,以及下标操作符。代码逻辑很简单,就是准备调用环境,然后把C#的参数push到lua层,然后pcall调用,然后从lua栈中取出返回的结果,由于lua是弱类型的,无法事先知道返回值的类型,所以这里只能使用通用的GetObject函数对lua的返回值进行类型转换。原创 2023-11-18 11:52:31 · 1160 阅读 · 0 评论 -
xlua源码分析(二)lua Call C#的无wrap实现
从命名中也可看出,field对应的是C#的字段和方法,getter对应的是C#的get属性,setter对应的是set属性,meta就是对外设置的metatable了。和tolua一样,xlua也会把C#对象当作userdata来处理,每个要push到lua层的C#类型都有唯一的type_id,对应到不同的metatable,用来定义userdata的行为。并且,除了值类型和枚举类型之外,所有push到lua层的C#对象,都会在C#层缓存,这一点也是和tolua一样的,甚至缓存的数据结构也大差不差。原创 2023-11-04 11:16:36 · 1442 阅读 · 0 评论 -
xlua源码分析(一) C# Call lua的实现
与tolua一样,lua函数被C#引用时,都会存放到registry表中缓存,同时C#获取到该函数的reference之后,会生成一个负责生成具体委托的包装类对象,这里就是DelegateBridge,它是以弱引用的形式存放在delegate_bridges里的,这里使用弱引用,因为delegate_bridges只负责查询,真正引用它的是具体的委托。另外,xlua的DoString是有返回值的,返回类型是object数组,也就是C#可以执行任意的lua代码,并且直接获取到lua代码的返回值。原创 2023-10-21 13:45:04 · 237 阅读 · 0 评论