Chinaunix首页 | 论坛 | 博客
  • 博客访问: 99242
  • 博文数量: 41
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 486
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-18 20:09
文章分类

全部博文(41)

文章存档

2016年(1)

2015年(1)

2014年(9)

2013年(30)

我的朋友

分类: C/C++

2013-05-13 09:05:58

擦, 字数太多会导致日志审核不通过?
-----------------------------------------------------------------------------------
线程主循环
-----------------------------------------------------------------------------------
        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) |
0

上一篇:tlbb-code anolyze

下一篇:tlbb-login server2

给主人留下些什么吧!~~