擦, 字数太多会导致日志审核不通过?
-----------------------------------------------------------------------------------
线程主循环
-----------------------------------------------------------------------------------
ret = Select( ) ;
ret = ProcessExceptions( ) ;
ret = ProcessInputs( ) ;
ret = ProcessOutputs( ) ;
ret = g_pLoginPlayerManager->ProcessCommands( ) ;
ret = g_pLoginPlayerManager->ProcessCacheCommands( ) ;
ret = g_pLoginPlayerManager->HeartBeat( ) ;
-----------------------------------------------------------------------------------
ret = Select( ) ;---这里说了read set,其他write set, exception set都是一样的。
-----------------------------------------------------------------------------------
用的select, 重定义了fd_size=1024, 配置两台login server, 也就是说一组服务器最多支持2000个人。
fd_set read_set[2], 有玩家登陆, fd_set(read_set[0]), 有玩家退出fd_clr(read_set[1], read_set[0]);
select的时候用read_set[1]从read_set[0]拷贝, 然后select read_set[1]
我原来做法是定义一个online_vector, 玩家登陆退出时操作该集合。select的时候根据此集合初始化read_set.他的这种做法比我原来的好。可以把我自己原来的那个select库改下。
我的做法
--loop(online_vector)
--fd_set(read_set)
他的做法
--read_set[1]=read_set[0]
写到这里发现他的代码还是不够封装,居然在逻辑层还要处理这些网络的事情。应该把网络库封装的更加完整一些,让逻辑更简单清楚。
-----------------------------------------------------------------------------------
ret = ProcessInputs( ) ;
-----------------------------------------------------------------------------------
根据前面select到的read_set,
1,判断是否有新连接
2,遍历所有在线玩家,看是否有数据要读。如果有数据,则读到玩家的读缓存中。此处遍历还是要遍历玩家列表,因为要存入到玩家的读缓冲中,不能用之前的read_set[0].
-----------------------------------------------------------------------------------
ret = ProcessOutputs( ) ;
-----------------------------------------------------------------------------------
遍历所有在线玩家,看是否有数据要发送。如果有,则从玩家写缓冲中获得并发送。
写事件总是会触发。如果没有数据可写的话,此处会耗cpu。
-----------------------------------------------------------------------------------
ret = ProcessCommands( ) ;
-----------------------------------------------------------------------------------
遍历所有在线玩家的读缓存,如果有数据,则循环读取,直到一条完整消息,取出处理,如果要发送,则存入玩家写缓冲。
总结: 效率不高啊,还不如让网络层接受消息,然后插入到消息队列,逻辑层从消息队列取消息处理来的清晰和快速。
阅读(403) | 评论(0) | 转发(0) |