ydLua 异步相关注意事项

ydwe github lua相关issues

注意

T党J党以前的异步逻辑要改变一下,以前通常不被魔兽校验的数据都可以异步。 比如你异步私自改了某个哈希表引用的单位 做显示用!那么在lua引擎里可能会导致gc后 玩家的handle不同步,得到蝴蝶效应。纷纷掉车!

避免lua异步的口诀

本地玩家睁大眼 除了显示不要浪

匿名闭包频繁创 不如写为动作行

lua引擎能允许的异步操作更少了,所以除了必要异步(如显示面板)请全部同步执行 匿名闭包函数 是由jass回调lua函数 在大量频繁创建下 容易异步。尽量改为触发的动作 即单列模式运行。 像ForGroup这些传闭包函数的 可以直接在lua层封装调用循环取第一个单位 以达到不让闭包进入jass回调里

详细注意事项

issues的问题大部分是在极端情况下才会出现的 这里整理出主要需要注意的事项

全局表 = {}

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

比如匹配单位这些条件,如选取范围内的敌人,直接选取范围内的所有单位传null条件 然后再在遍历单位组时if判断是否为敌人再执行操作)

* 冥等性操作举例(即以下可以异步,其余要同步):

一些建议

一些测试数据

lua与jass的回调闭包, 回调10w次 并在回调里做修改增加操作,未异步。(具体回调上限值多少可能每次不会相同)

lua pairs 1w字符串key的表 多玩家 未出现随机顺序不一致

扩展阅读

备注

lua传递给jass的闭包不会被释放 所以要尽量少传闭包过去

lua传给jass的 Filter 可以搞成单列的 不要手动销毁它 (据说相同code会得到同一个实例)

filter 尽量传null 然后在遍历单位组时根据想要的条件if判断 这样就没有闭包到jass了

#TS做图的无需注重以上问题 太阳rpg编辑器提供的 TS基础做图框架可充分避开以上异步问题。

太阳rpg编辑器TS框架以面向数据方式编程。与jass的闭包交互 基本都是单列模式

可以理解为一个功能只有一个闭包(不是每触发一次功能就会产生一个闭包)。

总体闭包数量不会超过1000. 远远低于以上测试值 不会触发异步

初始化全局变量时已重写部分函数比如ForGroup这类传闭包的已在lua层面while第一个单位执行回调 不会进入jass

提供了中心计时器等 如BaseUtil.runLater(time,fun)即可在lua层完成计时回调