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程序集里的对象或方法被持有的情况。

返回顶部