egret白鹭引擎RES资源管理模块,资源动态加载失效BUG,加载卡死BUG,完整解决方案与超详细调试漏洞过程

        我是千里马,是一位软件工程师,最近几天完成了用户中心全套内容设计和游戏中大大小小的各种bug处理解决,准备开始游戏的正式填充,突然想起来还有两件抛之脑后的事情没有做。因为之前一直都是忙碌大方向内容设计研发,有一些小的bug就直接暂时性质的忽略。

        刚好,最近几天比较大的基础工程都已经完工了,所以专门抽出时间来解决这些小一些的问题,那下面就正式开始这次debug过程吧。

        这次的任务是解决白鹭引擎RES资源加载模块相关问题,算是引擎的坑。

        每次进入游戏的时候都会跑3个进度条,但是其中的问题就是每次读条都会有10%-20%的几率加载卡死,加载卡死就会导致什么问题呢?导致玩家一直在等这个加载进度条,而难以发现其实已经卡死了,每次遇到都得重新刷新一下游戏而避免开这10%的中奖率,所以带给了玩家很糟糕的体验。

        之前的解决方案都是给加载界面添加一个提示语,让玩家不要一直等,多多刷新

        这是一个很棘手的bug,几率性的触发bug,所以我并不能用传统断点查来源的debug方式去调试这个bug,因为可能这次是正常的,下次不正常,我也不知道我这次到底是正常还是不正常,只有跑出来结果才可以知道正常不正常。

        所以传统简单方便的调试方式在这里就无效了。

        最开始应该是做什么事情呢?当然是应该在白鹭论坛,看一看网友们和官方提示是怎么解决的。

        根据官方提示把资源加载线程设置为1,不用多线程加载就可以避开这个bug。但是网友开发者们都表示这是无效的,没什么作用,当然我很早之前也测试了这个解决方案,没用,该卡照样卡。

 这位就是官方,也同时给出了一个并不能解决的解决方案修改加载线程为1

RES.setMaxLoadingThread(1)

        所以后面就正式的开始了这次debug之路。

        首先我进行测试出现这个bug的频率,基本上每5次出现1次,频率算是比较高的。然后我就好奇想看一看加载卡住了,我直接关闭掉这个加载界面直接进游戏是什么样子的。

        场景和邮箱系统变成了这样

         背包系统呢?变成了这样。

 正常情况应该是这样的

         从这里我们就可以发现一部分事情,这里记为A0事件

  1. 一部分资源加载了,一部分资源没有加载,而且大部分资源都没有加载。
  2. 点击那几个背包的文字还是可以切换页面的代表游戏业务逻辑不受当前bug影响。
  3. 一部分放在res管理器中配置好的预先加载的资源都已经正常加载并且引擎已经使用。
  4. 已经正常加载进缓存的资源可以通过读缓存的方式使用该资源

        基本上可以判定为,资源动态加载失效,进一步测试,发现eui资源即时加载也就是source属性失效,RES资源管理异步加载RES.getResAsync也失效,不管怎么加载返回都是undefined。

        所以我们理一下逻辑。

  • 加载完资源的时候>>>RES资源管理器卡死>>>不触发资源加载事件完成>>>卡死在加载页面
  • RES资源管理器卡死+不触发资源加载事件完成>>>任何资源即时加载都失效>>>不触发资源加载事件完成

        好了,这里开始就有一个疑点了,加载完成之前都经过了什么关键的事件,首先在出现bug情况的开始页面,前几次是可以正常即时加载资源的。也就是说开始页面的加载完成回调一点问题都没有,并且也可以进行资源组加载资源。

        那为什么后面几次加载就出这种bug呢?所以我也和这个bug干上了,就要查出来。我先进行对自己代码检查。顶层代码是龙骨页面展示内容,没有一点问题。

 再往核心看,看封装起来的我们自己的lib库框架。

         正常的加载也没什么问题,不过资源加载是调用另一个核心库的。这时候我就开始怀疑了,是不是说,我们封装的这个库这里资源加载是用了一个资源组,而每次使用加载函数都是放一个资源进去,有一些研发不对应导致的问题,不管怎么样我都试一试,把这次的资源组组改成单个资源组加载,避免掉这种组处理bug,可能就会解决这次问题了。

        然后我就把代码改成了这样的单独组的加载模式。

         然后又测试了几遍,没一点用啊,bug出现的几率也没变,问题依然存在,那么这就表示和资源组处理导致的bug没关系,也就排除了我们后期写业务逻辑代码导致问题的可能性了。

        所以我就继续深入架在egret引擎上的核心库。看看他是什么样的业务逻辑。

         core核心库也表示和自己没一点关系,并且把锅直指egret引擎上的RES资源管理系统本统。到目前为止没有一点成果。所以我就应该换方向。多次触发试试。

        弄成多次触发,看看是不是和资源加载名字,加载顺序,和重复加载,回调嵌套,以及作用域有关联,所以我写了一个这样的一个无限回调地狱屎山代码。

tubao.Appli.loading.play("preload", () => {
            tubao.Appli.loading.play("scene5000", () =&
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值