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 吗?
ET中玩家都在Map中,消息在map中加协程锁就行了,已经加好了。这里不用加协程锁
IRequest类型的消息都是没有携程锁的
IRequest消息的处理里面,凡是异步用到session的地方,都有可能因为session的突然断开(gm踢人或者SessionIdleCheckerComponent、SessionAcceptTimeoutComponent)被销毁,导致代码报错。
异步完,判断session是否被释放,又太繁琐了
不想报错,又不想加判断代码
解决办法是《session断开你加上协程锁再删除玩家,所有消息都加协程锁,跟发给Unit消息一样就行》
这个问题所有人都会遇到,不是个别问题。
是不是干脆统一在框架里,给IRequest和session断开,加携程锁比较好?希望et加上这个处理吧
我看看