Fiber
Fiber
(纤程)的运行类型分为Main/Thread/ThreadPool
三种类型。纤程可以理解为轻量级的线程,即消耗更少、功能更简洁、使用更灵活。
Main
只跑在主线程上的Fiber
本质上和Unity
原生没有任何区别。
Thread
跑在固定线程的情况,系统不会按需调度。
ThreadPool
每次使用都会分配一个随机线程给它,系统按需调度。
简单的游戏不需要关心性能,可能就用不上,只需要在主Fiber
编写逻辑即可。当你定义好所需的Fiber
类型以及调用,其它的逻辑也只有事件(应该是这样,如果有不对的地方随时修改)需要关心自己依附在哪个Fiber
上,也是单线程编写体验。
举个例子:当客户端存在复杂计算时,可以单独创建一个Fiber
进行专门处理,每次通过Actor
进行消息传递,再将计算结果通过Actor
返回到主Fiber
,把更多的性能留给主Fiber
用于渲染以及物理计算等。
ET框架的客户端初始时有两个Fiber
,分别是Main
和NetClient
,分别处理游戏主逻辑与网络逻辑。
所以为了充分发挥主机性能,可以提前规划好主要功能的分类,以便于创建对应的Fiber
。
例:游戏主逻辑(包括渲染和物理计算)、网络逻辑(负责消息分发)、战斗、热更新(边玩边下)、资源加载等等。
Actor
ET8.1的Book中,详细解释了Actor
是什么,以及使用场景和需要规避的东西。
理解起来比较复杂,我一开始没吃透。但是好在ET
中内置了实现Actor
最关键的组件,分别是用来接收消息的MailBoxComponent
、发送消息的ProcessInnerSender
。只需要在创建完Fiber
后,将这两个组件挂载到Fiber
的Scene
上,即可让该Scene变成一个Actor,从而实现消息分发。
根据Demo
中的登录,我绘制了一个如下的登录流程图参考。
协程锁
附上ET论坛的协程锁介绍。
会发生死锁的情况:在我发给你Call
的消息里,你又在处理的逻辑里写了一段Call
我的消息,此时我的队列还在等回信处理不了你Call
过来的消息,导致我这边卡住,然后导致你那边的Call
卡住,从而产生死锁问题。
好在ET6
引入了超时自动解锁的解决方案,就算死锁了也能找到问题的位置。
可以使用框架里自带的测试用例OperaComponentSystem
进行测试。