70. 2023-07-23周总结
- 小游戏充值流程补充
- 小游戏进不去问题
- 游戏服务端每个玩家Tick功能
1. 小游戏充值流程补充
上周充值流程里说到Android流程里面,如果微信服务器notify到我们服务器这一步丢失了,但可能造成丢单。这周同事发现微信提供接口,根据微信订单号或者商户订单号(自己内部拼接的订单号)来查询订单状态。因为最终游戏服务器加钻石的记录会与商户订单号绑定,所以充值有没有加成功可以根据这个接口进行查询和补发。而且这个不发流程未来可以集成到客服接口里面进行自动补发。
2. 小游戏进不去问题
发现小游戏偶现无法进入问题,而且没有任何异常。最终发现网络层回调的到业务逻辑层的时候业务逻辑层抛异常了,但是Unity没有捕获这异常(或者捕获了没有输出异常信息),导致消息接收循环逻辑乱了。为了安全在网络层回调业务层的时候手动自己加了异常捕获,确保整个消息接收循环不受业务层影响。
3. 游戏服务端每个玩家Tick功能
服务端经常会有倒计时的功能,比如各种刷新(日刷,周刷,月刷),功能倒计时(解锁某个技能倒计时,升级倒计时)等等,这种一般会用定时器去做,但是定时器的时候会涉及到一些问题:
- 定时器的回调是否在统一线程(框架保证)
- 如果玩家下线了,如何取消所有注册的定时器
定时器的回调是否在统一线程(框架保证)
这个一般框架来保证回调会和业务处理在同一个线程,不会造成线程安全问题
如果玩家下线了,如何取消所有注册的定时器
这里有两种方式去取消:
- 每个用到定时器的模块,下线的时候自己取消(比较繁琐)
- Player身上封装定时器模块,所有其他模块注册定时器的时候用改模块来注册,定时器模块下线的时候自己取消所有注册的定时器(比较简单)
推荐第二种方式,略微封装之后会带来很大的便利。
增加Tick功能
除了上面说的通过常规定时器实现功能外,最近在框架里面增加了一个没500ms tick的功能,这样各个模块写定时功能会比较简单。要倒计时的功能放在tick里面检查就行。而且上线的时候也不用单独写加定时器的函数。用起来感觉比定时器方便。唯一的问题就是每500ms,tick一次,可能会导致cpu空消耗,但可以增加代码便捷性以及降低出问题的风险,还是比较值的的。