天龙服务器线程模型分析

               天龙服务器线程模型分析

 

        通过《天龙服务器架构》文档,我们已经知道了天龙的构架,现就各程序的线程模型做一个分析。

        先从最简单的World程序开始,World相对于整个服务器组来说是比较重要的,如果World出问题,整组服务器都需要重启,所以World需要保证相对简单。天龙的World是单线程的,所有功能模块的逻辑都在同一个线程中处理。

1     World线程模型

 

        Login程序有四类线程(我对Login线程做过调整,现在介绍的是我调整后的线程模型,与旧的线程模型有一些不同)

1ClientConnectThread负责处理接入的客户端。LoginPlayerManager管理一个角色数据池,当有新的连接进入时,从数据池中分配一个角色数据,然后进行初始化,接入后,便会把数据转入ProcessThread线程处理其它逻辑。

2ServerThread负责处理WorldBilling的连接,这个线程的作用就是接收及发送WorldBilling的消息,并保持连接。

3DBThread负责处理DB数据请求,DBThreadManager管理着多个DB线程,每个DB线程是一个独立的数据库连接。它们处理与数据库相关的逻辑,包括创建角色、加载角色数据等。

4ProcessThread处理Login中的角色逻辑。ConnectThread把新的客户端接入Login后,便转给ProcessThread,由ProcessThread来处理客户端消息。

        一个角色连接Login时,最先由ClientConnectThread负责Socket接入,然后把数据转到ProcessThread线程,由此线程来处理客户端的消息(创建角色、请求角色列表、登陆等),如果需要数据访问数据库,ProcessThread会给DBThreadManager发送数据库访问的消息包,DB线程请求完数据库后,给ProcessThread返回结果消息包,由其接着处理相关逻辑。如果需要与BillingWorld通信,ProcessManager会给ServerThread发送相应消息包,由ServerManagerWorldConnectManager转发出去。

 

2        Login线程模型(调整后)

 

        Server端的线程分四类:

(1)ServerThread:负责与World通信。由于涉及到多线程问题,所以发往World的消息包,都是动态创建出来的,发送给ServerManager的消息缓存队列,ServerManager把消息发送到World后,再把消息包删除(释放内存)。

(2)SceneThread:场景线程。处理场景心跳逻辑,服务器启动时,根据场景配置文件,创建多个场景线程,加入到线程池。服务器每个场景属于一个独立的线程,多个场景可以属于同一个线程。场景线程驱动场景心跳函数处理场景内所有逻辑。

(3)ClientThread:客户端接入(进入游戏及切换Server进入),这个线程只处理客户端连接到Server时的逻辑。当角色连接服务器时,ClientThread从角色数据池中分配一个GamePlayer,初始化Socket然后将GamePlayer转给相应的SceneThread,由SceneThread处理游戏逻辑。

(4)DaemonThread:守护线程。负责副本、城市场景动态加载以及其它一些功能模块。

        场景线程处理了场景内的所有逻辑,包括场景内玩家消息包收发、场景内NPC、怪物的AI和逻辑等;Server收到World的消息包后,会根据角色所在的场景,把消息包转发到相应的场景线程中,再由场景线程处理相关逻辑;角色切换场景时会先从原来的场景中把数据清除,然后给目的场景线程发送一个进入场景的消息包,目的场景处理角色进入逻辑,接管GamePlayer数据。 

3      Server线程模型

猜你喜欢

转载自blog.csdn.net/qdslp/article/details/9173747