• Bug
  • session 突然断开,对业务逻辑的影响

egametang 这里的问题是,存档分为下线自定存档和定时存。

业务逻辑继续,又改变了玩家数据,这是不会再存档了,因为玩家已经被踢掉了,销毁了,定时存档的定时器也被销毁了,也就丢档了

23 天 后

egametang

这个能不能在框架层处理?

毕竟玩家的操作太多了,每个操作协议都要加这个锁,要加的地方太多了,有没有比较简单优雅的方式接触这个问题?

复用每个玩家的Mailbox锁行不行?

    egametang

    是在 SessionPlayerComponentDestroySystem里,加 CoroutineLockType.ActorLocationSender 吗?

    ET中玩家都在Map中,消息在map中加协程锁就行了,已经加好了。这里不用加协程锁

      egametang

      IRequest类型的消息都是没有携程锁的

      IRequest消息的处理里面,凡是异步用到session的地方,都有可能因为session的突然断开(gm踢人或者SessionIdleCheckerComponent、SessionAcceptTimeoutComponent)被销毁,导致代码报错。

      异步完,判断session是否被释放,又太繁琐了

      不想报错,又不想加判断代码

      解决办法是《session断开你加上协程锁再删除玩家,所有消息都加协程锁,跟发给Unit消息一样就行》

      这个问题所有人都会遇到,不是个别问题。

      是不是干脆统一在框架里,给IRequest和session断开,加携程锁比较好?希望et加上这个处理吧

      加哪吧锁呢?帐号?这个时候有些消息发过来还没帐号呢,加session Id也不对,这里不好统一加。自己在几个关键消息上加吧

        1 年 后

        15951836388 gate 登录后的 rpc消息这么加协程锁和验证是不是正确的呀?

                    Player player = session.GetComponent<SessionPlayerComponent>()?.Player;
                    if (player == null)
                    {
                        response.Error = ErrorCode.ERR_ProcessWrong;
                        return;
                    }
        
                    long sessionInstanceId = session.InstanceId;
                    long playerInstanceId = player.InstanceId;
                    using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.GateUser, player.Id))
                    {
                        // 下线或者被顶号了
                        if (session.InstanceId != sessionInstanceId || player.InstanceId != playerInstanceId
                            || player.Session.Id != session.Id)
                        {
                            response.Error = ErrorCode.ERR_ProcessWrong;
                            return;
                        }
                        
                        Scene domainScene = session.DomainScene();
                        int domainZone = session.DomainZone();
                        ......
        说点什么吧...