T党J党以前的异步逻辑要改变一下,以前通常不被魔兽校验的数据都可以异步。 比如你异步私自改了某个哈希表引用的单位 做显示用!那么在lua引擎里可能会导致gc后 玩家的handle不同步,得到蝴蝶效应。纷纷掉车!
本地玩家睁大眼 除了显示不要浪
匿名闭包频繁创 不如写为动作行
lua引擎能允许的异步操作更少了,所以除了必要异步(如显示面板)请全部同步执行 匿名闭包函数 是由jass回调lua函数 在大量频繁创建下 容易异步。尽量改为触发的动作 即单列模式运行。 像ForGroup这些传闭包函数的 可以直接在lua层封装调用循环取第一个单位 以达到不让闭包进入jass回调里
issues的问题大部分是在极端情况下才会出现的 这里整理出主要需要注意的事项
- 同理 对于非幂等性的操作尽量不要异步。通常(创建删除修改)是非幂等性的 查看显示通常是幂等性的
- 避免异步全局引用 以免造成不同玩家GC后handle不同步:比如:
全局表 = {}
if 玩家1 == 本地玩家 then
全局表[某单位] = true
全局表[xxx] = 某单位
end
- 避免思路:除显示外或冥等性的操作其余全部同步执行计算。即每个玩家计算所有玩家的数据。即使某些数据可能根本不需要用到。 如其他玩家的个人查看面板 也要同步创建 再判断玩家进行异步显示 (少用,本地玩家,少在本地玩家的判断力执行操作,一不小心你的异步操作可能会引起地图异步) 闭包给jass的回调尽量少用 在lua层封装即可 实在无法避免的可声明一个函数 传函数名当回调(单例命名函数会比每次都新建匿名函数泄露低)。
比如匹配单位这些条件,如选取范围内的敌人,直接选取范围内的所有单位传null条件 然后再在遍历单位组时if判断是否为敌人再执行操作)
- 无法避免怎么办?lua异步是几率性的,无法避免就不要避免,只会让你的异步几率变大, 但并不是100%或5%几率异步不能玩!(具体几率看你操作,操作得好就是99.99%不异步。为什么不是100%?因为机器本身就无法保证100%正确可靠的) 不要过度恐慌! 通常往上述方向去尽量靠 异步几率不会超过0.1%
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层完成计时回调