C#跟Lua如何超高性能传递数据 (2)

这中间有很多宏,看着很乱,但其实我们只需要用2种模式就行了,因为我们只实现int跟double。作者给出的方式是如下这种

[StructLayout(LayoutKind.Explicit, Size = 8)] public struct LuaJitTValue { // uint64 [FieldOffset(0)] public UInt64 u64; // number [FieldOffset(0)] public double n; // integer value [FieldOffset(0)] public int i; // internal object tag for GC64 [FieldOffset(0)] public Int64 it64; // internal object tag [FieldOffset(4)] public UInt32 it; }

但这里我有一些我还没弄明白,因为我实际运行起来后,不管lua赋值的是整形,还是浮点,int i始终没有值,值都存在了double n中。那为啥作者要弄一个int i跟UInt32 it; 这个it还偏移了4字节

在c#端我们可以使用[StructLayout(LayoutKind.Explicit)][FieldOffset(0)]来实现c语言中的联合体,具体方式可以看这篇文章
https://blog.csdn.net/wonengxing/article/details/44302661

如何用unsafe模式读写结构体?

结构体都定义好了,接下来我们看看怎么读写一个double

LuaJitGCtab32* TableRawPtr; //需要拿到Lua端Table的指针 //赋值操作 TableRawPtr->array[index].n = val; //取值操作 TableRawPtr->array[index].n;

没错,就是这么简单。直接就可以操作lua内存了。

如何拿到lua端table的指针?

在lua端传入一个table参数过来,我们可以在c#端操作虚拟栈转成指针

System.IntPtr arg0 = LuaDLL.lua_topointer(L, 1);

看到这里,相信大部分的谜团都已经解开了,真的自己可以实现一套出来了。

总结

作者提供的方案里,只支持int、double。只支持array类型的table。还有luajit64位貌似没支持好。所以如果真正要使用的话,还要改很多东西

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyzwy.html