网上流传天龙 Server代码分析笔记 -01

g_Server全局Server对象。
main()
{
	//初始化配置文件模块
	g_Server.InitConfig();
	//时间模块需要最开始的时候设置
	g_pTimeManager->Init(); 
	//日志模块初始化需要最开始设置
	g_pLog->Init( );
	g_pTimeManager->SetTime() ; //==>获取当前时间 年月日
	==>{
			time( &m_SetTime ) ;
			tm* ptm = localtime( &m_SetTime ) ;
			m_TM = *ptm ;
		}
	
//-------------下面就是核心部分-----
	g_Server.InitServer( ) ;

	g_Server.Loop( ) ;

	g_Server.ExitServer( ) ;

}

一、初始化
Server::InitServer()
{
	//分配内存
	NewStaticServer( );
	==>{
		g_pMonsterPool = new MonsterPool ;
		g_pPetPool = new PetPool ;
		g_pSceneManager = new SceneManager ;
		g_pPlayerPool = new PlayerPool ;
		g_pPacketFactoryManager = new PacketFactoryManager ;
		g_pServerManager = new ServerManager ;
		g_pWorldManager = new WorldManager ;
		g_pMachineManager = new MachineManager ;
		g_pGUIDManager = new GUIDManager ;
		g_pPlayerShopPool	=	new PlayerShopPool;
		g_pItemBoxPool	=	new ItemBoxPool;
		g_pPlatformPool	=	new PlatformPool;
		g_pSpecialPool	=	new SpecialPool;
		g_pAbilityManager = new AbilityManager;
		g_pStaticShopManager = new StaticShopManager;
		g_pCopySceneManager = new CopySceneManager;	//副本场景管理器
		g_pItemManager = new ItemManager;
		g_pDaemonThread = new DaemonThread;	// 后台线程
		g_pDiePenaltyManager = new DiePenaltyManager;	// 死亡惩罚数据
		g_pPerformanceManager = new PerformanceManager; // 数据监控管理器
		//---最后两个 是重点
		g_pThreadManager = new ThreadManager ;	//[线程管理器]
		==>{
			m_pThreadPool = new ThreadPool ; //-->此线程池只容纳所有 场景线程
			m_pServerThread = new ServerThread ; //-->服务器线程(m_Active = TRUE ;)
			m_nThreads = 0 ;
		}
		g_pClientManager = new ClientManager ;	//[客户端管理器]
		==>{
			if( !g_pIncomingPlayerManager ) //-->[连接的玩家管理]
			{
				g_pIncomingPlayerManager = new IncomingPlayerManager ; //客户端网络层链接和数据
											/**★因为重要,提前粗略介绍下
												有ProcessInputs和ProcessOutputs函数
												ProcessOutputs==>负责接收新连接和客户端的数据
												ProcessOutputs==>负责将GS数据发送给Client
											 */
			}
			m_Active = FALSE ;
		}

	}

	//初始化各个模块
	InitStaticServer( );
	==>{
		//①初始化共享内存数据
		g_HumanSMUPool.Init(); // --玩家数据共享内存
		g_PlayerShopSMUPool(); // --玩家商店共享内存
		g_ItemSerialSMUPool(); // --物品序列化共享内存
		
		//②表格
		g_ItemTable.Init(); // --物品表初始化
		g_TableInit.Init(); // --表格初始化
		
		//后逻辑模块数据
		g_pMonsterPool->Init(g_Config.m_ConfigInfo.m_MaxMonster);
		g_pPetPool->Init(g_Config.m_ConfigInfo.m_MaxPet);
		g_pPlayerPool->Init(MAX_POOL_SIZE);
		g_pPacketFactoryManager->Init( ); //包 工厂管理{CG & GC}
		g_pWorldManager->Init(); //世界管理器
		g_pMachineManager->Init(); //服务器机器
		g_pGUIDManager->Init(); //全局唯一标识管理器
		g_pItemBoxPool->Init(); //物品盒池
		g_pPlayerShopPool->Init(g_Config.m_ConfigInfo.m_MaxPlayerShopNum); //玩家商店池初始化
		//...各种容器、管理器初始化
		//--最后
		g_pServerManager->Init(); //服务器管理
		==>{
			
			
		}
		g_pThreadManager->Init(); //线程管理(之前说过,是主要管理所有场景线程的)
		g_pClientManager->Init(); //客户端管理
		g_pDaemonThread->Init(); //后台线程管理
	}
}

二、Server循环
Server::Loop( )
{
	g_pThreadManager->Start( ) ;
	==>{
		m_pServerThread->start(); //服务器线程启动
		==>{//--线程执行函数
			ServerThread::run()
			==>{
				while(1){
					g_pServerManager->Tick(); //
				}
			}
		}
		MySleep( 500 );
		m_pThreadPool->Start(); //线程池启动
		==>{
			while(1)
				m_apScene[i]->Tick(); //
		}
	}

	//主线程调度资源分给ClientManager来执行;
	g_pClientManager->start( ) ;
	==>{
		ClientManager::run();//
		==>{
			g_pIncomingPlayerManager->Select( ) ;

			g_pIncomingPlayerManager->ProcessExceptions( ) ;

			g_pIncomingPlayerManager->ProcessInputs( ) ;

			g_pIncomingPlayerManager->ProcessOutputs( ) ;
			g_pIncomingPlayerManager->ProcessCommands();
			g_pIncomingPlayerManager->ProcessCacheCommands();
			g_pIncomingPlayerManager->HeartBeat();
		}
	}

	g_pDaemonThread->Loop( ) ;
	==>{
		//定时器初始化{Work,FlushLog}
		//日志刷入文件
		//副本场景管理管理器的逻辑调用
		g_pCopySceneManager->HeartBeat( uTime );
		//数据监控逻辑调用
		g_pPerformanceManager->HeartBeat( uTime )
		g_ShareMemNotifyer.HeartBeat(uTime);
		//定时关闭服务器处理
		g_Server.Stop();
	}
}

三、退出Server
Server::ExitServer( )
{
	//①等待各线程退出
<span style="white-space:pre">	</span>//②释放内存
}
//--



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值