ET框架相关
最近想要用C#写一个自己的游戏服务器框架。由于工作中使用的是ET框架7.2,导致写的时候脑子都是ET的模样。
多线程相关
ET框架在8.1版本使用了多线程。作者抽象出了Fiber
的概念。每个Fiber之间不互相操作内存,通过发消息通信。通过分析器限制全局静态变量写法,避免多线程操作内存的问题。
Fiber的重要组成部分:
- ThreadSynchronizationContext,用于同步上下文,执行异步方法的回调。
- SceneRoot : 用来管理所有的Entity
- EntitySystem : 用来管理所有的System
- Mailboxes : 用来管理所有的Actor的Mailbox
作者实现了3种调度器。
- MainThreadScheduler:主线程调度器,加入的Fiber会在主线程的Update中设置线程同步上下文后执行Update。
- ThreadPoolScheduler:线程池调度器,加入的Fiber会在线程池中执行。
- ThreadScheduler:线程调度器,加入的Fiber会在指定的线程中执行。
热更新相关
热更限制
热更代码
目前除Hotfix程序集以外的程序集均无法热更。不能新加协议(但是可以新加现有协议的Handler),不能新加组件。需要在热更后执行一些操作的组件需要实现LoadSystem,正常逻辑绝大多数不需要实现LoadSystem。热更配置
目前暂无热更配置后的事件。需要注意的是有些数据已经存在了数据库里,并且此时玩家也不在线,热更配置影响不到。
如果热更活动配置,可加热更配置事件实现,将活动组件内的活动重新计时。
热更是怎么实现的
CodeLoader
类里AssemblyLoadContext
对象控制了Hotfix程序集的加载和卸载。热更时,在加载新的Hotfix程序集后,将App,Core,Model,Hotfix以及他们引用的程序集的所有Type都加载到EventSystem中,执行实现LoadSystem的类的Load方法。如MessageDispatcherComponentLoadSystem.Load
,会将标记MessageHandlerAttribute
的Handler类重新创建一份对象用于处理玩家请求。
服务器端的Hotfix只有逻辑,没有数据。数据被放在Model中,所以服务器端可以在运行时重新加载修复dll。需要注意旧的Hotfix程序集里的对象或方法被持有的情况。