提一个7 8年前就发现的lua引擎的异步
jass.message 里面的 发送本地命令 函数 是会掉线的。
当本地命令的间隔 低于0.15秒 调用多次 是会导致掉线的, 尤其是英萌里面 用本地命令模拟瞬发类的技能, 当该瞬发技能无cd的时候 鼠标狂点就会立即掉线
另外 当本地命令调用的时候 刚好遇到其他的数据正在同步 魔兽的操作封包 会合并成一个 处理前面的本地命令,会丢掉后面的同步处理 也会导致概率异步, 正常情况下不要用这几个本地命令
大佬,如果使用了本地用户操作了table,(存储特效的handler)例如本地用户关闭了特效,特效的地址用了空字符串,返回的特效id=nil,而没有关闭的玩家,他们返回的时候是有值的,这样我后面循环table(延时处理),删除特效的时候,是否会发生异步?
另外如果很多的字符串被异步创建并销毁了,lua的gc运行后,是否有可能导致完全与其无关的teble<string,table>,这里面的string的随机值发生变化,最后循环不一致,导致掉线?
必须 require("jass.runtime").handle_level = 0 否则 大于0的配置 acb将 魔兽的handle 绑定到 lua的表对象上面, 跟lua gc绑定到一起了, 如果有本地玩家, 异步的ui事件 或者按键事件 就会导致 有异步对象引用 就会导致引用计数异步 就会掉线, 这是个没有考虑好的设计。
字符串的问题 根据ydwe的版本来决定, 如果是ydwe1.32版本的话, 字符串自身也有分配个gchash id 用来pairs遍历的, 如果异步产生字符串 也会导致pairs顺序异步。 而1.31的方案则不同 问题有很多细节 我不想赘述了。
盲测了一波 除了魔兽内部对数据包处理卡(延迟)爆表外没发现异步 (kk编辑器, 2个玩家)
特效的地址用了空字符串,返回的特效id=nil
用空字符串("")创建特效不会返回null/nil
~~顺便嘴一下魔兽的异步99.99%来源是 tag(yd的定义是objectid_64)被异步创建/删除了 (省略约30字的详细信息) 基本上 hook + log 一下魔兽的相关函数就能得知哪里异步了~~
盲测了一波 除了魔兽内部对数据包处理卡(延迟)爆表外没发现异步 (kk编辑器, 2个玩家)
特效的地址用了空字符串,返回的特效id=nil
用空字符串("")创建特效不会返回null/nil
~顺便嘴一下魔兽的异步99.99%来源是 tag(yd的定义是objectid_64)被异步创建/删除了 (省略约30字的详细信息) 基本上 hook + log 一下魔兽的相关函数就能得知哪里异步了~
你要确保技能cd小于0.1秒, 并且不会卡在施法前摇的阶段, 然后开连点器 异步点击事件的时候发布一次 施法一次 就知道了。
其实现在魔兽lua脚本引擎 因为有了许多掉线的因素存在 变得十分的不稳定, 非常轻易的掉线, 但凡你用lua写地图 第一张图必定会遭遇掉线的问题, 这么多年下来见怪不怪了, 你说的handle引用计数异步只是其中一个因素, 还有更多的, pairs顺序,本地玩家或异步事件里修改了数据,甚至还有 带视野+地形纹波会导致地形坐标z轴异步, 甚至我还遇到了非常奇怪的 窗口化跟全屏的浮点数不一致 写一张地图 动则几万行lua脚本 找一个位置犹如大海捞针。
因此我有了设计新的引擎的规避掉线的想法,而且写了这么多年的lua 我其实不太喜欢lua, 所以新的引擎采用其他语言方案,保证性能 内存 异步 安全方面都做了针对性的处理 新的引擎我已经封闭式开发写了2年了 由于现在的环境不是很愿意对外公开。
这个世界发展那么快,不要这几十年前的东西上吊死了。多看看外面的世界多美好。
这个世界发展那么快,不要这几十年前的东西上吊死了。多看看外面的世界多美好。
至少我们还有兴趣, 乐此不疲。
你要确保技能cd小于0.1秒, 并且不会卡在施法前摇的阶段, 然后开连点器 异步点击事件的时候发布一次 施法一次 就知道了。
(农民)
三个技能 狂战士 疾步风 神圣护甲 cd 0 蓝耗0 持续时间0.001 (之前就是这样设置的)
触发也换成鼠标点击事件 + 开连点器 (CPS 20)了 还是没有复现
~~帧刷新也试了 一个不限帧 一个限帧64~~
你要确保技能cd小于0.1秒, 并且不会卡在施法前摇的阶段, 然后开连点器 异步点击事件的时候发布一次 施法一次 就知道了。
(农民) 三个技能 狂战士 疾步风 神圣护甲 cd 0 蓝耗0 持续时间0.001 (之前就是这样设置的) 触发也换成鼠标点击事件 + 开连点器 (CPS 20)了 还是没有复现 ~帧刷新也试了 一个不限帧 一个限帧64~
其实我感觉打印gchash id的数量是最直观的。
另外,上面那个代码高频确实是有大概率会掉线的,他是一个SendEvent,理论上来说它只是ClickButton的下一层,但是实际测试中它确实会导致掉线。
调用的魔兽函数代码大概是这样的
// 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 那行是同步玩家当前选择的单位
另外,上面那个代码高频确实是有大概率会掉线的
我本地复现不出查不了具体情况
调用的魔兽函数代码大概是这样的
// 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平台的测试服, 由于购买点击速度太快 也产生了掉线 加上间隔又好了, 还是不太建议使用, 如果你觉得没问题就大胆的用把。