actboy168 / YDWE

A Tool to Help the Creation of Warcraft III Map
GNU General Public License v3.0
463 stars 139 forks source link

lua引擎的又一个掉线问题 #202

Open w4454962 opened 3 years ago

w4454962 commented 3 years ago

当 handle_level 大于0 时

handle在lua引擎中是为 userdata 或者 table

他们在底层里 存在引用会 handle_ref 占用handle句柄 直到不存在任何引用 也就是被__gc 的时候 才会调用 handle_unref 释放handle句柄的占用

也就是说

全局表 = {}

if 玩家1 == 本地玩家 then 全局表[某单位] = true end

只有一个玩家在引用该handle 而其他人没有,

当 lua进行gc时 会导致handle不同步 进而发生掉线

这个也是为什么前2年 用jass2lua 测试一些jass地图会发生掉线的问题 那些地图里 没有注册闭包 也没有pairs 的掉线原因。 而且是在游戏40分钟后 也就是内存达到一定程度 lua自动gc的时候 才发生的掉线。

w4454962 commented 3 years ago

应该在 RemoveUnit DestroyTrigger 这些 销毁方法 被调用时 进行handle_unref 解引用 不应该跟lua gc绑定到一起

也可以尝试在 先handle 转 object 然后hook 虚函数表+4 的析构方法 在析构对象时进行解引用, 这个不确定 需要下个断点 看看执行顺序