场景切换loadScene方法返回true,但是没有切换场景

【应用场景】
1.使用cocos creator制作游戏课件
2.一个课件由多个课件页组成
3.每个课件页对应一个scene
4.当教师翻页时,会通过websocket给学生端(ipad)发送实时消息
5.当学生端接收到翻页消息后会调用cc.director.loadScene(name)执行翻页

【问题】
1.偶现学生翻页不同步
2.因为课件是内嵌到教室中使用
3.教室中还包含直播音视频,播放本地音视频,ipad实现的奖励动画等等操作
4.而这些操作都是很耗内存的
5.在频繁执行以上操作的时候翻页会大概率出现学生端课件不同步问题

【分析】
从上周一(2017年11月27日)开始后添加了线上日志,从日志分析,loadScene在课件不同步的时候返回的都是true,且目标页和当前页相同,也就代表cocos认为是翻页成功的,但是实际场景中确实翻页不成功

要看看不同步时是否有报错?

多谢大神关注,我补充下

1.这个问题很难复现,我公司qa怎么测试都不复现,包括把ipad带回家里测试
2.但是只要线上已上课,基本每节课都有1-2个学生不同步
3.拿这个做例子,从第1页翻到第2页,在loadScene的回调中
不同步的时候,有时候回调中会告诉我在第2页,但是实际还是第一页,有时候会告我在第一页,实际在第一页,总之就是不同步

总之是根据loadScene的回调判断是否同步不现实,或者说不准确,目前的做法是
每4s去服务器获取一次当前页(教师每次翻页会记录到redis),如果服务器页和ipad页不一致,则location.reload,
之前试过不同步则再次调用loadScene,但是一直不成功,

第一块是正常的日志
第二块是回调中判断,目标页和当前页不一致,开始尝试再次loadScene
第三块是很长时间内都停留在game_01这个页面,每个loadScene都不生效

所以之后只能修改为location.reload这种方式,目前还在尝试

至于是不是报错,这个不知道在哪里看,线上使用的都是构建后的,而且ipad端看不到console,

是不是可以改写什么方法,我把报错日志发到线上或者发到ipad上,例如改写cc.error?

麻烦分析下现在的问题,如果需要可以加我qq,284687430,感激不尽~

我第一次听说这样的反馈,很多游戏项目内存应该占用更大,好像也没有场景切换不成功的先例,所以感觉是你们那边业务出错的几率比较大。建议捕获下浏览器的全局报错,如果出错了,把完整信息发送给服务器看看。
捕获方法是监听 window.onerror,网上有很多资料,你可以看看。

多谢回复,我这边用你的方法监听下error上报服务器,有结果了同步过来,

麻烦您也看看我之前的分析,加了线上log,表示不同步后,一直在调用loadScene,但是一直停留在不同步页面,

是否有可能ipad4内存瞬时飙高导致cocos卡死?

分析1:https://shimo.im/docs/YEzg6UkgFyMN2oF2?r=R4NG5K
分析2:https://shimo.im/docs/Oq5swbiP2REEAzvY?r=R4NG5K
分析3:https://shimo.im/docs/raEDkCYJSaIWG1EP?r=R4NG5K

代码分析,这个比较重要,麻烦看看,
https://shimo.im/docs/wgnyFH6y6tgD0LQP?r=R4NG5K

难得有这么详细的分析,所有 CP 都能这么专业的话,引擎的疑难 bug 恐怕都能修好。
先看看有没有 error 吧,没有的话再试试其它方法。

今天线上环境没有上报error,测试环境有几个coocs引擎的error上报,但是不影响上课,最下方贴出来,

有个问题需要确定
cc.director.loadScene(name, onLaunched)中,onLaunched回调函数执行的时候,确定目标页已经加载完毕么,
从线上日志分析看,
如果从page1翻页到page2的时候,不同步的时候,
在onLaunched回调函数中中调用cc.director.getScene().name,获取当前页,
一般情况下返回page1,也就是没同步,这个和现象一致,
但是偶尔会返回page2,也就是onLaunched运行的时候cocos告诉我已经翻页到page2了,但是实际场景还是不同步,

还有一个情况,当教师端翻页后,ipad接收到翻页消息执行loadScene的时候,有时候8-15s或者更长时间才翻页,


这两种情况结合起来,有没有可能是onLaunched回调函数中获取当前场景的时候,当前场景还没有加载完毕,
loadScene在某些情况,例如内存瞬时飙高,cpu瞬时飙高的时候,这个过程会很漫长

附上,今天早上测试环境返回的几个error,两个错误,前四条一种,后一条一种,

错误1
错误信息:TypeError: null is not an object (evaluating ‘this._sgNode.setOpacity’)
出错文件:file:///C:/Users/cjx/AppData/Local/FutureCloud/cache/nova/00_cocos/0.0.1/cocos2d-js-min.js
出错行号:6
出错列号:57993
错误详情:none

错误2
错误信息:TypeError: null is not an object (evaluating ‘c.length’)
出错文件:file:///C:/Users/guan%20hui/AppData/Local/FutureCloud/cache/nova/00_cocos/0.0.1/cocos2d-js-min.js
出错行号:24
出错列号:31175
错误详情:none

虽然今天没有上报error,但是有一次不同步,触发了reload机制,reload后课件同步,详细分析见我上面的分析3,已经更新

是的

是不是有资源下载不到?

这个很可能是进入场景时执行的操作,不过如果抛出异常,应该跟 onLaunched 回调就不会被执行才对。

如果onLaunched执行的时候目标页已经加载完毕,此时获取cc.director.getScene().game应该是获取的目标页

但是线上有一个场景是,从page1到page2,
onLaunched中返回的还是page1,这个和上面结论不一致,
还有一个中onLaunched中返回page2,过几秒钟,getScene返回的还是page1,比较奇怪

所有课件都是先下载到本地后才运行的,不存在资源下载过程,会不会是资源加载过程慢?比如cpu,内存高的时候,
游戏启动是使用的file://这种方式启动的,不存在网络加载

目前线上没有报这个错误,之后在观察下

会不会是两个场景切换太频繁,互相干扰了

真实上课场景没有频繁切换,都是切一页讲几分钟,再切,

而且切换按钮有保护,点击后置灰

这段时间测试环境有上报一些error,线上环境没有,测试环境error除了之前的两个error,还有:




1赞

同样遇到这个问题,从场景1切换到b,场景并没有切换,也没有报错。