不如_dota吧 关注:1,673贴子:63,856
  • 2回复贴,共1

关于dota里出现的红字warning

取消只看楼主收藏回复

有人可能在do1里遇到过,就是满屏的红字,提示各种xx错误的:

CRITICAL ERROR: FOUND NO AVAILABLE GROUPS
Send this replay to IceFrog@gmail.com
致命错误:找不到可用的单位组
把rep发到IceFrog@gmail.com(邮箱)

Please send me this replay (X)
请把这个rep发给我(X)

An internal checksum has failed
This might not be a serious glitch, but it is important for me to get it
Please send me the replay for this game to IceFrog@gmail.com
一个内部校验和(checksum)失败了
这可能不是一个严重的故障,但是它对我来说很重要
请把游戏的rep发到IceFrog@gmail.com(邮箱)
今天就来研究下,什么是校验和(checksum),什么又导致了上面warning


IP属地:江苏本楼含有高级字体1楼2014-05-03 23:02回复
    Ⅰ.产生机理
    在游戏开始时,会运行一个函数:
    创建120个待用的单位组,group[0、1、2...119]
    考虑到单位组基本都是使用,然后马上清空,所以120个单位组绝大多数时候、绝对够用的!
    1.马上销毁意味一个玩家放了个范围技能,如,用到了选取范围内单位做动作,那么一个单位组就在这瞬间用过了。过了1s或0.1s,另一个玩家也使用类似技能,那么此时可用的单位组还有120个;
    2.使用很多数组。一般发生在选取单位做动作,被做动作的单位又触发新的动作(如幽鬼受到伤害,然后折射)。极端、极端情况下就瞬间用掉了120个单位组;
    出现①的条件:
    几乎每个用到单位组的地方都会用到函数funcA,分配给待用的单位组g一个空闲数组。如果没有空闲的数组,则临时创建一个额外的“放养”单位组,并显示红字文本。
    出现②的条件:
    先说下这个红字出现的时机,当游戏结束时,出现“xx军团获得胜利..汉化作者..最新版本请访问..”,之后才可能会出现。条件为:游戏结束时还有100+的单位组被占用或曾经单位组的handleid出现非正常值。
    X——被占用的单位组数量
    出现③的条件:
    跟上面2个有所不同,第三个提示的触发条件跟触发器(Trigger)数量有关。
    当新建了一个触发器,就需要在用完后进行排泄。如前所述funcA,这里也有个到处可见的funcB,用来辅助clean trigger:
    1.disabletrigger.先让该触发器不会被触发,并记录当前时间T1;
    2.因为是“辅助”clean trigger,所以trigger在该阶段还不算被clean;
    进入游戏时,注册15s周期事件,检查是否有等待被destroy的trigger,
    1.trigger只有在destroy后才算排泄干净(严格意义上,还需要排泄动作(如果有),这里不展开了WE吧有精帖);
    2.每一个时间事件到期时,若当前时间T2>T1+60s,则clean trigger;
    若在这个15s时间内,等待被clean的trigger超过了8000个,则显示文本~
    来极尽可能简单的总结下:若游戏进行期间,某个瞬间被使用的单位组超过120个OR在15秒内运行的触发器超过8000个,则会出现刺眼的红字提示


    IP属地:江苏本楼含有高级字体2楼2014-05-03 23:06
    回复
      2026-05-12 08:28:47
      广告
      不感兴趣
      开通SVIP免广告
      ↓↓↓建议跳过↓↓↓
      Ⅱ.补充


      1.handleid非正常值
      任意单位组的handleid - 第一个单位组的handleid,大于120或小于0。
      关于这个判定还有一些疑惑,应该来说这个值肯定在[0,120]范围内的,因为这120个单位组用完以后清空然后重复利用,没道理handle值会变。
      2.120个单位组/8000个触发器限制
      可能考虑到系统的稳定性,具体这个120的数字怎么出来的,还未可知。
      若瞬间新建8000个单位组(做简单动作)/16000个触发器,则war3卡一下,所占内存上升3m/11m;
      若2个触发相互嵌套,新建共8000个单位组,则war3直接消失;当单位组为1350以下,war3才不会直接“嘣”。不过事实是这1350的阈值并非跟单位组有关,触发之间只要嵌套那么多层就必然会崩。
      Ⅲ.checksum
      也就是上面的8000触发器限制。通过检查一定时间使用的触发器数量,来验证过程中“错误”因素。更多可以百度hash和MD5


      IP属地:江苏本楼含有高级字体4楼2014-05-03 23:08
      回复