关于3.X版本切后台导致websoket断线的问题

2.X版本游戏切到后台后引擎逻辑貌似依然在执行,各种定时器能正常工作,比如websoket的心跳保持就没问题。3.X版本后,切后台后逻辑完全停止,导致返回前台时定时器已经停止了,websoket断线
导致用户看完广告视频无法通知服务器发放奖励。3.4.1版本日志中说调整为切后台后主逻辑依然执行,但是还是有一些问题,下面是测试结果:

3.4.0和更早版本:
安卓原生:切到桌面,返回游戏WEBSOKET掉线
IOS原生:切到桌面,返回游戏WEBSOKET掉线
微信等小游戏平台:按关闭按钮或者切到桌面,返回游戏WEBSOKET掉线

3.4.1社区win32-010808版本:
安卓原生:切后台返回websoket并未断开,但是有一些问题,详见下面详解!
IOS原生:切后台返回websoket并未断开,立即调用网络请求服务器发放看视频奖励,一切正常
微信等小游戏平台:按关闭按钮或者切到桌面,返回游戏WEBSOKET掉线

341版本安卓原生返回游戏后,监听返回游戏game.on(Game.EVENT_SHOW, this.onEventShow)和隐藏game.on(Game.EVENT_HIDE, this.onEventHide)两个事件,如果在EVENT_SHOW事件前执行任何逻辑就会导致黑屏或者部分画面贴图变成黑块。如果在EVENT_SHOW之后执行也有一定概率会这样,越高端的机器越好。低端机器感觉可能是处理太慢也有一定概率黑屏。我们加了一个定时器,在2秒后让JAVA层通知JS层调用网络发奖励。但是这个2秒也只是个权宜之计,可能更低端的机器反应更慢2秒也不够。
以上是高端机器的表现,如果使用低端机器(我的两个测试机是oppo a5 oppo r9),返回游戏不管什么时机调用WEBSOKET,直接黑屏,LOGCAT里疯狂刷报错D/WebSocket.cpp: ERR: internal signal handler caught signal 11

综上所述,一个简单的引擎切到后台和返回,2.X版本从来没操心过这个问题。3.X现在很混乱,导致一个最常见的看视频后联网发奖励的需求变得难搞。另外备注下,安卓原生广告SDK使用的是穿山甲,微信小游戏使用是官方的广告视频组件

1赞

我们切后台是主动断开,没发现这样问题

你确定 你的程序挂起后 你还能保持运行状态? 你是怎么确定的 是 怎么做到的?

2.2.2版本我们用的,切到后台后,客户端还可以给我们服务器发送心跳,客户但本地有个定时器给服务器每隔几秒发个心跳包

我有点表示怀疑,程序挂起后 不可能在运行了 更不用说你的客户端还能定时TICK ,除非你是后台服务类型的

@448730690 感谢反馈,我们看看。

发布下最新进展,升级到v3.4.1-win32-011909版本,测试结果如下:

OPPO/VIVO小游戏:看激励视频时,客户端setInerval定时器停止,且websoket也收不到数据了

微信:看激励视频时,客户端setInerval定时器未停止,websoket可以继续收数据

QQ/字节小游戏:看激励视频时,客户端setInerval定时器停止,websoket可以继续收数据

安卓IOS原生:看激励视频时,客户端setInerval定时器未停止,websoket可以继续收数据。另外看完激励视频返回时,通过JAVA通知JS层逻辑执行发奖励的逻辑,贴图丢失或者直接黑屏。官方客服说不能做任何操作再引擎完全返回之前

鉴于以上特性:我们分平台对心跳机制,奖励发放进行了调整,勉强解决了问题。可正常使用,不知道引擎机制以后会不会改

黑屏问题已经在 3.4.2 解决, 后续可以更新试试

66666,辛苦了

mark 好像问题不少的样子。我们最近也要用。

WebSocket.cpp: ERR: internal signal handler caught signal 11
这个问题,我发现一个必现逻辑:
一、3.4.2版本:androidStudio 运行后开启profiler 查看运行内存情况。这个时候游戏中任意发送一个网络请求,都会导致程序崩溃,并不断提示WebSocket.cpp: ERR: internal signal handler caught signal 11,如果没有开启profiler检测,就不会出现
二、3.6版本:测试结果一样,开启profiler后发送网络请求,都会崩溃,只是没有上面的err报错

测试手机是realme X青春版(RMX1851) android11 6G内存 64G存储