cocos creator , 接Mopub的广告, 在播放广告后 点击node出弹窗,弹窗的UI渲染异常

  • Creator 版本:

  • 目标平台:

  • 详细报错信息,包含调用堆栈:

  • 重现方式:

  • 之前哪个版本是正常的 :

  • 手机型号 :

  • 手机浏览器 :

  • 编辑器操作系统 :

  • 编辑器之前是否有其它报错 :

  • 出现概率:

  • 额外线索:

cocos creator 版本 :2.0.10、 2.0.14

描述详细点 是播放完广告,关闭广告后回到游戏, 然后点级游戏中的节点出现弹窗,发现弹窗的UI乱了,像是底层渲染出现异常

什么平台的?

如果是IOS,可以参考下这个处理

Android 平台

是偶现, UI渲染在播完广告回来后整个错乱了

看日志的error信息发现有这句:E/libEGL: call to OpenGL ES API with no current context。 大神有什么办法可以绕过去嚒?

救急!!!

这个错误说明引擎渲染的view还没恢复,是时序问题,你调用cocos的逻辑,得保证渲染使用的view已经恢复,建议你实现个状态缓存,从JS引擎发起轮询获取广告状态,在不知道怎么处理时序的情况下,操作由JS端发起,可以规避很多问题。

广告状态是获取到有广告时调用的播放接口,播放广告用的 runOnUiThread 在ui线程中。你说的时序我不是太明白噢

激励广告的回调接口我是在广告的oncomplete中调用的, 是否需要在onclose中调用比较合理, 实验发现广告播放完毕先调用oncomplete在调用onclose

激励广告播放完毕需要由Android调用JS端的回调, 是这个回调调用的时机不对吗? 那应该怎么规避呢?我们一般调用JS端的回调是在Android注册的广告播放完毕回调中。

你的回调是在GL线程调用的吗?这时候GL绑定的View是不是已经恢复到前台了?

回调是在GL线程中, Gl绑定的View怎么判断是否恢复到了前台呢? 我觉得可能没恢复,因为广告点击关闭后,才会回到游戏中,这个时候游戏有前台事件产生。

而目前的回调调用时广告播放完毕调用的,不是在关闭时刻调用的。但是渲染异常的现象也是偶现 不是必现

我截个图给你看一下

下面的 onRewardVideoJsCallback() 是调用js端回调的地方,

1. 不要在 onRewardedVideoComplete 的时候执行 Js 回调

因为这个时候,用户还没有关闭广告,所以 GlView 还在广告之下,所以哪怕你在这个时候执行了JS的回调,修改了游戏的逻辑之类,其实对于用户而言是透明的其实你执行了用户也看不到

这个时候,缓存 是否播放成功的值

同时这也是应对大大的建议:

2. 在 onRewardedClosed 的时候执行 Js 回调

同时需要附带上 onRewardedVideoComplete 的缓存值(如果有的话)

因为此时用户已经关闭了 广告界面,看到了游戏界面,GLView 也执行了 onResume,所以此时的JS回调会比较有意义,因为用户可以看到游戏界面的改动

3. 延迟一下

在 onRewardedClosed 的时候,你可以延迟一下发送Js回调,又或者 在js接收到操作的时候延迟一下执行

比如 this.scheduleOnce()

4. 补充

在第二点中 onRewardedClosed 之后的回调,其实也不一定立即保证 GLView 已经恢复了

在一些广告平台上或者聚合广告源上,会有可能出现 onRewardedClosed 后 GLView 也没那么快恢复

所以这个时候,大大的做法才可能是最靠谱的

1赞

我已经缓存播放完毕的状态, 等关闭时候在调用的回调,在某些手机上还是会出现。我如何能判断是否需要延时调用js端的回调呢? 毕竟是偶现,大部分时候直接调用没问题。

有没有办法判断GLView是否已经恢复 ?,没有恢复 时 我做延时调用。