C# Class Lobby.UserProcessScheduler

玩家数据处理调度器,玩家数据请求将被放到并行的若干个线程里进行处理。 有2类线程: 1、由DispatchAction调用发起的操作,此时执行线程无法指定。 2、调度器内部实例化一个线程,用以进行必须在一个线程里进行的操作。(未对外提供接口,目前假定用于为1中操作需要有序的服务。)
这个类采用多线程操作数据,所有成员都不能假定其工作的线程。 请注意四条约束: 1、UserInfo一旦实例化,内存不会被释放(只回收到池子里供重用,RoomInfo也是这样)。 2、对于只操作小于等于机器字长的数据的函数,不加锁(操作本来就是原子的)。 3、对于操作的数据大于机器字长的并且必须保证事务性更新的,需要加锁,每个UserInfo带有一个Lock属性(mono的读写锁有死锁bug,这里直接用普通锁)。UserInfo上持有的具有复杂结构的属性, 如果该结构/类里涉及集合操作,应该对该结构/类的数据进行封装并通过内部加锁或lockfree机制保证多线程操作安全。 4、此类方法除Get开头的方法外通常通过DispatchAction调用发起,具体线程分配考虑如下: a、玩家进入房间后基本上只有房间线程会修改玩家数据,故RoomProcessThread会直接修改玩家数据(通常都是简单数据或状态修改)。 b、玩家在大厅内但没有进入房间时的操作由Node发消息到Lobby,然后经DispatchAction调用各方法进行处理。 c、玩家在游戏中RoomServer会需要修改玩家数据,此时会发消息到Lobby,然后经DispatchAction调用各方法进行处理。
Inheritance: MyServerTaskDispatcher
ファイルを表示 Open project: dreamanlan/CSharpGameFramework Class Usage Examples

Private Methods

Method Description
ActivateUserGuid ( ulong guid ) : void
AddOrUpdateUserInfo ( Msg_LB_BigworldUserBaseInfo baseUserInfo, Msg_LR_RoomUserInfo roomUserInfo, int leftLifeTime ) : UserInfo
AddWaitRecycleUser ( ulong guid ) : void
BroadcastText ( ulong guid, BroadcastType type, string content, int roll_ct ) : void
DispatchJsonMessage ( uint seq, int sourceHandle, int destHandle, byte data ) : void
DoCloseServers ( ) : void
FreeKey ( uint key ) : void
GenerateKey ( ) : uint
GetGuidByNickname ( string nickname ) : ulong
GetUserCount ( ) : int
GetUserInfo ( ulong guid ) : UserInfo
IsPveScene ( int sceneId ) : bool
NewUserInfo ( ) : UserInfo
OnTick ( ) : void
RecycleUserInfo ( UserInfo info ) : void
RequestEnterScene ( Msg_LB_RequestEnterScene msg ) : void
Start ( ) : void
Stop ( ) : void
UserProcessScheduler ( ) : System
VisitUsers ( MyAction visitor ) : void