Fiber

Fiber(纤程)的运行类型分为Main/Thread/ThreadPool三种类型。纤程可以理解为轻量级的线程,即消耗更少、功能更简洁、使用更灵活。

Main只跑在主线程上的Fiber本质上和Unity原生没有任何区别。
Main

Thread跑在固定线程的情况,系统不会按需调度。
Thread

ThreadPool每次使用都会分配一个随机线程给它,系统按需调度。
ThreadPool

简单的游戏不需要关心性能,可能就用不上,只需要在主Fiber编写逻辑即可。当你定义好所需的Fiber类型以及调用,其它的逻辑也只有事件(应该是这样,如果有不对的地方随时修改)需要关心自己依附在哪个Fiber上,也是单线程编写体验。

举个例子:当客户端存在复杂计算时,可以单独创建一个Fiber进行专门处理,每次通过Actor进行消息传递,再将计算结果通过Actor返回到主Fiber,把更多的性能留给主Fiber用于渲染以及物理计算等。

ET框架的客户端初始时有两个Fiber,分别是MainNetClient,分别处理游戏主逻辑与网络逻辑。
所以为了充分发挥主机性能,可以提前规划好主要功能的分类,以便于创建对应的Fiber
例:游戏主逻辑(包括渲染和物理计算)、网络逻辑(负责消息分发)、战斗、热更新(边玩边下)、资源加载等等。

Actor

ET8.1的Book中,详细解释了Actor是什么,以及使用场景和需要规避的东西。
理解起来比较复杂,我一开始没吃透。但是好在ET中内置了实现Actor最关键的组件,分别是用来接收消息的MailBoxComponent、发送消息的ProcessInnerSender。只需要在创建完Fiber后,将这两个组件挂载到FiberScene上,即可让该Scene变成一个Actor,从而实现消息分发。
根据Demo中的登录,我绘制了一个如下的登录流程图参考。

客户端登录流程

协程锁

附上ET论坛的协程锁介绍
会发生死锁的情况:在我发给你Call的消息里,你又在处理的逻辑里写了一段Call我的消息,此时我的队列还在等回信处理不了你Call过来的消息,导致我这边卡住,然后导致你那边的Call卡住,从而产生死锁问题。
好在ET6引入了超时自动解锁的解决方案,就算死锁了也能找到问题的位置。
可以使用框架里自带的测试用例OperaComponentSystem进行测试。

最后修改:2024 年 05 月 16 日
如果觉得我的文章对你有用,请随意赞赏