egametang
但是 IRequest 消息只能拿到session。session被销毁了,就拿不到scene,拿不到其他组件,GatePlayer放在哪里呢?
别的类型消息,是可以不放到session上,但又会有另外一个问题。session被销毁,玩家踢下线,已经存档了。
但业务逻辑可能还在继续执行,又改变了玩家数据,这就造成了丢档。
《异步回来判断对象是否释放也是很正常的》凡是有异步的地方,都加要加判断,感觉代码太繁琐了
是不是所有类型的消息,都要把scene传进来,才行?
在第一行代码中获取到Scene啊
egametang 可能在第一行的时候,session已经被销毁了
第一步是session收到消息同步调用过来的怎么就销毁了
就算第一步就销毁了,那不更好,下面的逻辑又没执行,根本不会产生什么后果
egametang session被销毁,玩家踢下线,已经存档了。
但业务逻辑可能还在继续执行,又再次改变了玩家数据,这就造成了丢档。
这个问题,是不是要getcom的system事件,获取变化组件 + 缓存服,才能解决?
session断开,业务逻辑继续有啥问题呢?你如果所有业务都在gate上,那么session断开你加上协程锁再删除玩家,所有消息都加协程锁,跟发给Unit消息一样就行
egametang 这里的问题是,存档分为下线自定存档和定时存。
业务逻辑继续,又改变了玩家数据,这是不会再存档了,因为玩家已经被踢掉了,销毁了,定时存档的定时器也被销毁了,也就丢档了
加了协程锁就不会立即踢了,会等你协程逻辑完成
这个能不能在框架层处理?
毕竟玩家的操作太多了,每个操作协议都要加这个锁,要加的地方太多了,有没有比较简单优雅的方式接触这个问题?
复用每个玩家的Mailbox锁行不行?
15951836388 框架层已经处理,发给Unit的消息都加了协程锁
是在 SessionPlayerComponentDestroySystem里,加 CoroutineLockType.ActorLocationSender 吗?
ET中玩家都在Map中,消息在map中加协程锁就行了,已经加好了。这里不用加协程锁
IRequest类型的消息都是没有携程锁的
IRequest消息的处理里面,凡是异步用到session的地方,都有可能因为session的突然断开(gm踢人或者SessionIdleCheckerComponent、SessionAcceptTimeoutComponent)被销毁,导致代码报错。
异步完,判断session是否被释放,又太繁琐了
不想报错,又不想加判断代码
解决办法是《session断开你加上协程锁再删除玩家,所有消息都加协程锁,跟发给Unit消息一样就行》
这个问题所有人都会遇到,不是个别问题。
是不是干脆统一在框架里,给IRequest和session断开,加携程锁比较好?希望et加上这个处理吧
我看看
加哪吧锁呢?帐号?这个时候有些消息发过来还没帐号呢,加session Id也不对,这里不好统一加。自己在几个关键消息上加吧
egametang session Id 好像可以啊?
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(); ......