a seven

Results 68 comments of a seven

https://github.com/actboy168/YDWE/issues/197

异步的原因是 你 初始化给每个object 一个gchash 然后pairs 时加入到哈希算法里 一旦gchash出现异步 接下来 再new 的对象 就会出现不一样的gchash 在pairs 时 就会乱序了 你为了保证hash函数的随机性 导致的。

这个不可能 那string呢。 只要异步string gchash同样会异步

在魔兽里 避免异步table 比 避免pairs更难。

其实把 根据gchash 加入哈希算法 改成 根据gchash 遍历 就可以避免掉table 遍历异步的问题 只是损失的是那点不可靠的随机性

研读了一下源码, 发现重写pairs是简单的, 但是重写next 相对困难许多, pairs异步的地方正是在于next 只重写pairs并不彻底。

我想到了一个解决方案 在魔兽中 异步创建table 有2种可能 1 在异步回调的函数里 这个几乎可以无视 2 是在本地玩家的if里 主要解决的是在 本地玩家if 里的问题 那么很显然 只要gchash 关联lua栈 例如 下面伪代码 function test() local gchash = 1000 local t = {gchash = gchash} gchash...

复现的概率比较低,大概 1次开6个魔兽进一局游戏, 我大概测试6 7次出现一次,频率高的时候连续2把都出现。 可能跟函数的调用堆栈的深度有关,我朋友的地图里 调用深度比较复杂,每次多开都是必现的,在他的地图里,测试时是循环就掉线。

这个问题是存在的,贴吧也有人发帖说 循环 选取单位组 +闭包的方式出现掉线。

注册闭包掉线我修好了, 测试过了不再掉线了。 你自己合一下吧 我的分支是几年前的 [fix_closure.txt](https://github.com/actboy168/YDWE/files/5646569/fix_closure.txt) 修改了一下Condition 跟Filter的处理 很奇怪的机制 就是 如果没有对对象调用一次 DestroyCondition 方法的话 之后创建相同code的 都会返回同一个 handle。 而真正销毁 filter对象的却是 DestroyBoolExpr 奇怪的机制