美文网首页
修复pbkiller测试场景在构建运行问题

修复pbkiller测试场景在构建运行问题

作者: 张晓衡 | 来源:发表于2019-02-16 13:48 被阅读10次

    1. pbkiller报错啦!

    公众号用户「花无思」同学反应pbkiller在Cocos Creator 2.x上测试场景构test-pbkiller建后加载proto文件时会有报错。

    这里首先向「花无思」道个歉,pbkiller的不完善给你带来的困扰,其次是没能即时回复您在公众号上的留言。

    花无思的问题 加载Player message时报错

    这个问题确实是Shawn的疏忽,没有在构建模式做好测试,确实是test-pbkiller在构建模式下有机率出现问题,目前已经找到快速解决办法,已经提交了一个版本到Cocos商店。

    2. 问题分析

    从错误提示上看,是protobuf.js内部在解析ChatMsg中的playerInfo时出错,我们看一下,ChatMsg的定义:

    ChatMsg

    ChatMsg.proto文件中导入了Player.proto文件,再看Player.proto文件内容:

    Player

    文件定义都是正常的,为什么会报错呢?在pbkiller中为了兼容protobufjs的多种使用方法,pbkiller也提供了json格式的协议加载,因此之前Shawn为了图省事随手将Player.proto转换成了Player.json用于json格式的加载测试,看下面代码:

    let pb = pbkiller.loadFromFile('Player.json', 'grace.proto.msg');
    

    Shawn在好几次构建测试,并没出现问题,十分纳闷,这是为什么呢?但从上面的报错来看,敢肯定是与ChatMsg.proto、Player.proto、Player.json有关,而且与Player.proto、Player.json嫌疑最大。

    3. 问题追踪

    首先整理一下线索,有了一丝线索有就了行动的方向:

    1. 预览环境正常,在构建环境下有问题
    2. ChatMsg.proto依赖Player.proto,Player.json是不会在构建后产生冲突?

    只要问题能重现就好办,在反复多次尝试中,是将所有资源全部清楚,重新导入pbkiller的资源,重新生成文件的uuid终于在自己的电脑上也模拟出与「花无思」一样的报错提示:

    Uncaught Error: unresolvable type reference in Message.Field .grace.proto.msg.ChatMsg.playerInfo: Player
        at n.s.resolveAll (project.b7f47.js:1)
        at n.<anonymous> (project.b7f47.js:1)
        at Array.forEach (<anonymous>)
        at n.s.resolveAll (project.b7f47.js:1)
        at n.<anonymous> (project.b7f47.js:1)
        at Array.forEach (<anonymous>)
        at n.s.resolveAll (project.b7f47.js:1)
        at n.<anonymous> (project.b7f47.js:1)
        at Array.forEach (<anonymous>)
        at n.s.resolveAll (project.b7f47.js:1)
    

    我现在怀疑是加载ChatMsg时内部依赖Player.proto,加载成了Player.json,按理是加载Player.proto,导致的协议数据不完整,顺着这个思路,看看文件的加载顺序:

    image.png

    从上图看到

    Player.json: uuid为e271c45b-3873-4f26-bade-3ded28980b75
    Player.proto: uuid为52f10b58-b449-4821-bf3a-5c846a9a7a78

    在Dev Tools的Network页面,可以看到资源的加载顺序,先加载的Player.json,后加载的Player.proto,同时可以看到控制台下有报错。

    在这次构建时我设置了md5Cache选择,在之前将md5Cache关闭,是没有报错的,我看再一下Network中的加载顺序:

    image.png

    这次看到,代码没有报错,从Network,可以看到加载顺序变成了,先加载的Player.proto后加载的,Player.json。

    至此找到了问题出现在的原因:

    1. protobufjs在解析ChatMsg.proto时,ChatMsg.proto内嵌套了Player.proto
    1. 在加载嵌套的Player.proto时,由于Cocos Creator将文件名全部转换成了uuid,同名文件的加载顺序会不是固定不变的
    2. 同名文件名的加载顺序受到uuid的影响以及md5Cache的影响

    终于找到问题,于是将Player.json改成Player2.json,经过多次测试问题不在出现。

    小结

    这次查找pbkiller中测试用例的隐藏BUG很是费劲,不过收获还是不小:

    1. 预览环境与构建环境是有差异的,测试很重要
    2. md5Cache会影响到构建后的文件名,以及加载顺序
    3. 尽量不要有同名的配置文件存在,就算有加载时请指定文件类型

    相关文章

      网友评论

          本文标题:修复pbkiller测试场景在构建运行问题

          本文链接:https://www.haomeiwen.com/subject/dmsofqtx.html