不如_dota吧 关注:1,675贴子:63,857

关于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
    回复
      2025-06-21 14:39:13
      广告
      这么多年刀塔玩下来,印象中这种惊悚的满屏幕警告只遇到过一次


      IP属地:浙江来自Android客户端3楼2014-05-03 23:08
      收起回复
        ↓↓↓建议跳过↓↓↓
        Ⅱ.补充


        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
        回复
          话说。。dota2的官方数据在哪里找。。


          5楼2014-05-05 14:54
          收起回复
            我的大脑!


            IP属地:宁夏来自Android客户端6楼2014-05-05 16:57
            回复
              瞬间创建不太出现吧,
              实测分批创建了300万个空触发依然存活成功。
              当然必须是空的。


              IP属地:美国7楼2014-05-06 00:24
              收起回复


                IP属地:广东8楼2014-05-06 00:38
                回复
                  2025-06-21 14:33:13
                  广告
                  Please send this spe to Clytie@gmail.com


                  来自手机贴吧9楼2014-05-06 00:45
                  收起回复
                    应该是在连哈希表都没有的年代的遗留产物吧……现在还这么写真是自找麻烦


                    IP属地:浙江来自Android客户端10楼2014-05-07 00:54
                    收起回复
                      打ai遇到过n次了,普通局没遇到过


                      IP属地:河北来自Android客户端11楼2014-05-09 06:16
                      回复
                        太长看不懂,还有以前玩wtf船长那无限大招刷肉山是就遇到过→_→


                        来自Android客户端12楼2014-05-10 23:58
                        收起回复
                          我突然想到,如果天灾和近卫的基地同时爆掉,那么算哪边赢?这种情况分类讨论能有多少种结果?


                          IP属地:海南13楼2014-05-11 02:22
                          收起回复
                            是不是如果有卡尔(卡你),更容易出现?这个单位组上限,和地图大小有没有关系?


                            IP属地:海南来自Android客户端14楼2014-05-17 23:05
                            收起回复
                              2025-06-21 14:27:13
                              广告
                              为啥我单击虐人马虐久了也会有警告……


                              IP属地:美国来自Android客户端15楼2014-05-18 19:45
                              收起回复