无GC结构体:
![](https://img.haomeiwen.com/i11169528/5e69d81c248725c2.png)
在Xlua中生成的PackUnpack.cs中可以看到这些结构体在Lua和C#中传递是用的是字节缓冲区。并不需要生成Object。所以无GC。
但是在Lua中却经常会写
local v = Vector3(1, 2, 3)
这个会调用中UnityEngineVector3Wrap.cs的Utils.BeginClassRegister(type, L, __CreateInstance, 25, 10, 0);中的__CreateInstance创建实例。
不用创建实例写法是local v = {x = 1, y = 2, z = 3}这样的。
在VS Code中统一修改:在查找替换窗口这样输入
![](https://img.haomeiwen.com/i11169528/1a6f7afa660ffc52.png)
在查找项捕获三个数据。捕获项([^(),]+)是为了避免Vector3(1, x(2, 3), 4)这样的数据项:中间某些是函数值。这样的情况在完成上面的替换后有针对性地来修改这样的特殊数据(项目中不会很多的)。
别的结构体依此类推。
过多的字符串拼接
查找模式如下
匹配三个字符串拼接。
(.*?)((?:".+?")|(?:[\]\[\w\d_.]+?)) *\.\. *((?:".+?")|(?:[\]\[\w\d_.]+?)) *\.\. *((?:".+")|(?:[\]\[\w\d_.]+))(?<!\.)(.*)
((?:".+?")|(?:[\]\[\w\d_.]+?))这个是匹配 "" 中的字符串或变量值。不怕麻烦的话也可以支持 '' 单引号中字符串:((?:["'].+?['"])|(?:[\]\[\w\d_.]+?))
local a = "xx"
local b = {x = "yy"}
str = "aa" .. a .. b.x .. "x"
替换模式如下:
local _concat_ = {$2, $3, $4}\n$1table.concat(_concat_ , '')$5
这样一行变两行
local _concat_ = {"aa", a, b.x}
str = table.concat(_concat_ , '').. "x"
后发断言(?<!\.)就是为了不让$4匹配 .. "x" 中的两个点。
也可以依此类推8个字符串拼接的那种:
原来的字符串:
str = str..rep("\t", level + 1).."["..rep("\"", k_is_str)..(tostring(k) or type(k))..rep("\"", k_is_str).."]".." = "
变成了:
local _concat_ = {str, rep("\t", level + 1), "[", rep("\"", k_is_str), (tostring(k) or type(k)), rep("\"", k_is_str), "]", " = "}
str = table.concat(_concat_ , '')
避免table的rehash
待续
神奇的是这些都可以在vs code中完成。非常快的处理上千个文件
网友评论