卡死游戏

Cocos Creator v2.0.9 内测版发布帖(3-04 更新 rc.5) 继续讨论:
那我们游戏5M的代码,一旦有一个错误这样的错误,就整个游戏卡崩溃了

2.0 ECS 调整过比较多。现在追求的不是容错性,而是稳定性和执行效率。如果出错了,我们倾向于把错误暴露给用户,而不是容错。容错就是挖坑的开始,是万恶之源。

万恶之源。

不要你容错.你在主线程中卡死,一报错同一个错误一直报,然后就卡死,说不过去吧?玩家没法2玩了。功能多了,也不好排查是什么模块出了问题,表现是整个游戏没法玩,测试人员也不知道是什么地方开始的。

这句话听起来很有意思啊…难道是报错信息没有任何有用的信息?还是我应该理解成——如果引擎容错了,能跳过的错误就跳过,以后遇到跳不过的BUG你们可以顺藤摸瓜找出所有BUG点?

这位大哥怕是没有开发过游戏吧?一个项目组6-7个人,几十万行代码,你能确保没有一个错误?有一个错误,不是模块玩不了,而是整个游戏没法玩,是整个游戏,因为主线程卡死了。我在想,如果那么容易就解决所有bug,cocos引擎怎么没将引擎的所有bug解决掉呢?

实际开发过程中,因为bug不可避免,会将bug定义为严重,一般,轻微等等级的bug.优先解决严重的。

现在的问题是,几乎所有的bug都会卡死游戏,只能定义为严重。

小游戏开发…还没经历过中大型项目开发。
假设有一个错误数据产生了,接下来的游戏都要用到这个错误数据,那这个游戏该怎么进行?让玩家有BUG一般的开挂体验么。
再说,你举的例子可以理解成:因为BUG不容易修复,所以在项目开始时,引擎就应该把所有的错误都报出来,而不是直到它没办法容错为止。那个时候要debug我觉得更麻烦一点吧。几十万行代码,你还不知道导致这个BUG的真正原因是什么。
再者,引擎组这样做也是为了积极解决自身的问题吧,如果你用着引擎,用着用着突然崩溃,整个项目直接爆炸,这个时候你的标题就不是卡死游戏了…

大型的游戏都是模块化开发。模块之间耦合度尽量降低,数据进行切割。一个模块的出错,影响局限在单个模块内。玩家一个模块玩不了,对整个游戏的进程影响小。

js报错,不是没有表现的,会导致接下来的代码无法执行,界面上的表现是某个按钮点击后不弹框等,这个时候排查问题很容易。但是现在的表现是,一旦一个按钮点击出错,其余的所有按钮都点击没有反应了,真个游戏卡崩溃,mainloop一直在报错。我们的测试人员素质参差不齐,很多时候让完整叙述bug的重新过程非常困难,所以也加重了bug的排查难度。

举个例子,吉利造了一辆车,有很多bug,有音箱播放不了,有雨刷器动不了,等等。问题虽然很多,但是车还是能开。贾跃亭也造了一辆车,一旦音箱播放不了之类的问题,就会爆炸。你让开发人员怎么去排查问题?谁还买这种车?

经验不足,不确定我的表达是否合理。汽车之所以音箱播放不了,雨刷器动不了,还能开,那是因为它是汽车的附属部件。要是轮胎爆了,那这个车怕也是跑不起来吧。如果游戏中有一个弹框按钮,突然逻辑出现问题导致游戏直接卡死,那解决方案大概就2种吧。1是出问题后debug它,2是没出问题前trycatch它。这样才是轮胎和雨刷的区别吧。玩的游戏不多…举个例子像饥荒,装了MOD,能玩,突然MOD发生冲突,游戏一样直接崩溃。

我只是单纯的发表意见…没有站哪边的意思…
如果是因为升级2.0.9导致的原因的话,那现在比较快捷的解决方案大概是降回原先的版本了吧?

看到这里,我觉得还得再吐槽下,我觉得2.0的调整,显然是忽略了一些细节的东西,导致很多不合理。

  1. js报错卡死游戏,显然是不应该,1次报错,已经反映了问题,为什么要无限报错,导致游戏卡死呢。

  2. 今天在我们游戏中又发现一个无限报错导致卡死的问题,跟loadRes有关,这个我之前有反馈过类似的问题,但这个问题有点不一样,今天再次反馈下

     let pic = 'texture/img_name'
     cc.loader.loadRes(pic,cc.SpriteFrame,(err,res)=>{
         this.img.spriteFrame = res
     })
    

看这段代码,如果pic存在,则是正常的,pic不存在,就会报错1次,但在真机上app会无限闪屏,导致卡死。

原因是pic不存在,err信息不为空,然后res返回了一个空数组 [] 导致报错。

  • 实际开发项目中,我们一般都会忽略err信息,因为有err,大不了图片不显示(而且在2.0前的版本中,会有warning信息,可以很快帮我们定位问题)

  • 即使有err,res也不应该返回数组[],而是应该返回单个数据,因为在接口中已经传了资源类型了。
    麻烦引擎组确认下我反馈的第2点,这个对APP影响还是蛮大的。@jare

关于我之前反馈过的loadRes问题,可见
https://forum.cocos.com/t/bug-2-0-8/74095/7?u=tuyazuo

js报错这个问题我也遇到过了,确实是存在问题的,比如在生命周期的start函数内产生了一个报错,正常造成的情况是这个报错中断了后续的代码继续执行,而现在的情况是不断的抛出错误,并导致整个游戏线程彻底卡死,这里是引擎层是否应该考虑下以最小的代价抛出错误,不至于让游戏直接卡死。

1赞

这里有引擎大佬来解决吗?

这个问题,还有大佬解决吗?出错,游戏直接爆炸了, 还怎么玩????

异常截获一下 为了不让卡死做对应处理 白嫖人家的要求不要太高 :joy:

都2022年了
原生,小游戏一样,一个JS报错,直接爆炸,卡死
真机排查错误真TM难