YDWE icon indicating copy to clipboard operation
YDWE copied to clipboard

提一个7 8年前就发现的lua引擎的异步

Open w4454962 opened this issue 9 months ago • 13 comments

jass.message 里面的 发送本地命令 函数 是会掉线的。

当本地命令的间隔 低于0.15秒 调用多次 是会导致掉线的, 尤其是英萌里面 用本地命令模拟瞬发类的技能, 当该瞬发技能无cd的时候 鼠标狂点就会立即掉线

另外 当本地命令调用的时候 刚好遇到其他的数据正在同步 魔兽的操作封包 会合并成一个 处理前面的本地命令,会丢掉后面的同步处理 也会导致概率异步, 正常情况下不要用这几个本地命令

w4454962 avatar Apr 08 '25 09:04 w4454962

大佬,如果使用了本地用户操作了table,(存储特效的handler)例如本地用户关闭了特效,特效的地址用了空字符串,返回的特效id=nil,而没有关闭的玩家,他们返回的时候是有值的,这样我后面循环table(延时处理),删除特效的时候,是否会发生异步?

另外如果很多的字符串被异步创建并销毁了,lua的gc运行后,是否有可能导致完全与其无关的teble<string,table>,这里面的string的随机值发生变化,最后循环不一致,导致掉线?

zhoujieshantou avatar Apr 08 '25 13:04 zhoujieshantou

必须 require("jass.runtime").handle_level = 0 否则 大于0的配置 acb将 魔兽的handle 绑定到 lua的表对象上面, 跟lua gc绑定到一起了, 如果有本地玩家, 异步的ui事件 或者按键事件 就会导致 有异步对象引用 就会导致引用计数异步 就会掉线, 这是个没有考虑好的设计。

w4454962 avatar Apr 08 '25 15:04 w4454962

字符串的问题 根据ydwe的版本来决定, 如果是ydwe1.32版本的话, 字符串自身也有分配个gchash id 用来pairs遍历的, 如果异步产生字符串 也会导致pairs顺序异步。 而1.31的方案则不同 问题有很多细节 我不想赘述了。

w4454962 avatar Apr 08 '25 15:04 w4454962

Image 盲测了一波 除了魔兽内部对数据包处理卡(延迟)爆表外没发现异步 (kk编辑器, 2个玩家)

特效的地址用了空字符串,返回的特效id=nil

用空字符串("")创建特效不会返回null/nil

~~顺便嘴一下魔兽的异步99.99%来源是 tag(yd的定义是objectid_64)被异步创建/删除了 (省略约30字的详细信息) 基本上 hook + log 一下魔兽的相关函数就能得知哪里异步了~~

shuen4 avatar Jun 07 '25 02:06 shuen4

Image 盲测了一波 除了魔兽内部对数据包处理卡(延迟)爆表外没发现异步 (kk编辑器, 2个玩家)

特效的地址用了空字符串,返回的特效id=nil

用空字符串("")创建特效不会返回null/nil

~顺便嘴一下魔兽的异步99.99%来源是 tag(yd的定义是objectid_64)被异步创建/删除了 (省略约30字的详细信息) 基本上 hook + log 一下魔兽的相关函数就能得知哪里异步了~

你要确保技能cd小于0.1秒, 并且不会卡在施法前摇的阶段, 然后开连点器 异步点击事件的时候发布一次 施法一次 就知道了。

w4454962 avatar Jun 07 '25 02:06 w4454962

其实现在魔兽lua脚本引擎 因为有了许多掉线的因素存在 变得十分的不稳定, 非常轻易的掉线, 但凡你用lua写地图 第一张图必定会遭遇掉线的问题, 这么多年下来见怪不怪了, 你说的handle引用计数异步只是其中一个因素, 还有更多的, pairs顺序,本地玩家或异步事件里修改了数据,甚至还有 带视野+地形纹波会导致地形坐标z轴异步, 甚至我还遇到了非常奇怪的 窗口化跟全屏的浮点数不一致 写一张地图 动则几万行lua脚本 找一个位置犹如大海捞针。

w4454962 avatar Jun 07 '25 04:06 w4454962

因此我有了设计新的引擎的规避掉线的想法,而且写了这么多年的lua 我其实不太喜欢lua, 所以新的引擎采用其他语言方案,保证性能 内存 异步 安全方面都做了针对性的处理 新的引擎我已经封闭式开发写了2年了 由于现在的环境不是很愿意对外公开。

w4454962 avatar Jun 07 '25 04:06 w4454962

这个世界发展那么快,不要这几十年前的东西上吊死了。多看看外面的世界多美好。

actboy168 avatar Jun 07 '25 14:06 actboy168

这个世界发展那么快,不要这几十年前的东西上吊死了。多看看外面的世界多美好。

至少我们还有兴趣, 乐此不疲。

w4454962 avatar Jun 07 '25 22:06 w4454962

你要确保技能cd小于0.1秒, 并且不会卡在施法前摇的阶段, 然后开连点器 异步点击事件的时候发布一次 施法一次 就知道了。

Image(农民) 三个技能 狂战士 疾步风 神圣护甲 cd 0 蓝耗0 持续时间0.001 (之前就是这样设置的) 触发也换成鼠标点击事件 + 开连点器 (CPS 20)了 还是没有复现 ~~帧刷新也试了 一个不限帧 一个限帧64~~

shuen4 avatar Jun 08 '25 01:06 shuen4

你要确保技能cd小于0.1秒, 并且不会卡在施法前摇的阶段, 然后开连点器 异步点击事件的时候发布一次 施法一次 就知道了。

Image(农民) 三个技能 狂战士 疾步风 神圣护甲 cd 0 蓝耗0 持续时间0.001 (之前就是这样设置的) 触发也换成鼠标点击事件 + 开连点器 (CPS 20)了 还是没有复现 ~帧刷新也试了 一个不限帧 一个限帧64~

其实我感觉打印gchash id的数量是最直观的。

Image

另外,上面那个代码高频确实是有大概率会掉线的,他是一个SendEvent,理论上来说它只是ClickButton的下一层,但是实际测试中它确实会导致掉线。

luciouskami avatar Jun 08 '25 18:06 luciouskami

调用的魔兽函数代码大概是这样的

// 1.27.0.52240 6F69FFA0 (sub_6F69FFA0)
void IssueUnitOrder(unsigned int order, CAgent *agent, unsigned short flags) {
    CNetCommandUnitOrderBasic command(NET_COMMAND_UNIT_ORDER_BASIC);
    command.m_order = order;

    command.m_agent_tag.m_ptag = agent ? CAgent::PresenceTag(agent) : -1;
    command.m_agent_tag.m_btag = agent ? CAgent::BirthTag(agent) : -1;

    command.m_flags = flags;

    CGameWar3::Get(false)->GetLocalPlayer()->Selection()->Realize(false);
    NetSendCommand(command, NETSESSION_GAME);
}

Realize 那行是同步玩家当前选择的单位

另外,上面那个代码高频确实是有大概率会掉线的

我本地复现不出查不了具体情况

shuen4 avatar Jun 10 '25 03:06 shuen4

调用的魔兽函数代码大概是这样的

// 1.27.0.52240 6F69FFA0 (sub_6F69FFA0) void IssueUnitOrder(unsigned int order, CAgent *agent, unsigned short flags) { CNetCommandUnitOrderBasic command(NET_COMMAND_UNIT_ORDER_BASIC); command.m_order = order;

command.m_agent_tag.m_ptag = agent ? CAgent::PresenceTag(agent) : -1;
command.m_agent_tag.m_btag = agent ? CAgent::BirthTag(agent) : -1;

command.m_flags = flags;

CGameWar3::Get(false)->GetLocalPlayer()->Selection()->Realize(false);
NetSendCommand(command, NETSESSION_GAME);

} Realize 那行是同步玩家当前选择的单位

另外,上面那个代码高频确实是有大概率会掉线的

我本地复现不出查不了具体情况

你到11平台试一下, kk平台好像是要后台开启掉线才会触发, 我当年最早遇到这种问题,利用本地命令实现不打断单位操作的使用物品,遇到掉线, 后来用 本地命令+望远镜技能也遇到了 当年加上间隔就全都好了, 不过我现在本地也测试不出来 记不太清楚了。 前两年有个小伙伴 利用 技能+本地命令瞬发 实现的商店购买物品, 然后测试环境是在kk平台的测试服, 由于购买点击速度太快 也产生了掉线 加上间隔又好了, 还是不太建议使用, 如果你觉得没问题就大胆的用把。

w4454962 avatar Jun 10 '25 05:06 w4454962