极端情况,比如被gm踢人或者SessionIdleCheckerComponent、SessionAcceptTimeoutComponent,可以在任意时刻触发,销毁了他的session。
如果此时正好在执行这个用户的的协议业务,调用了session.domain等 会造成错误
理论上是否应该在任何业务逻辑执行中判断 涉及的entyty.isDisepose?同求答案
消息收到后立即跟session就没关系了啊,为啥还要要用到session.domain
egametang 很多业务里会用到session的,比如在session上绑了组件,需要获取等等
15951836388 不要挂Session上吧,Session 关联 Player,Player挂组件。
hualin 有的组件挂在session.domain上的
15951836388
你搞个GatePlayer来放数据撒,demo只是demo
搞个GatePlayer来放玩家的数据,不要放到Session上了,不过异步回来判断对象是否释放也是很正常的
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 吗?