kbengine unity3D 登录分析(初次登录流转过程)

上文说到流程到了Loginapp::login(),那么登录操作到了这里接下来会怎么走呢?往下看

 

Loginapp.cpp

996~1003:请求交给脚本操作

1096~1100 会将用户名和密码交到Dbmgr上进行查询

 

找到Dbmgr::onAccountLogin()

105行将任务交给了数据库线程池。

那么数据库线程池是怎么回事呢?以下虚线部分都是线程池的内容,如有了解可以跳过

 

----------------------------------------------------------------------------------------------------------------------------------------------------------

数据库线程池,每一个数据库接口都分配一个线程池,数据库接口在kbengine_defaults.xml中定义

 

数据库接口分配线程池在DBUtil的initialize()中,并用接口名称和线程池构成映射

db_interface.cpp

 

下图是获取某一数据库接口对应的线程池

db_interface.h

 

线程池:线程池中的线程进行了抽象,每一个线程都有一个成员curtask,将线程的运行函数中会执行curtask->process()。

CreatePool()创建线程池,这里会创建很多线程。

-----------------------------------------------------------------------------------------------------------------------------------------------------

 

531行的addTask就是之前pThreadPool所调用的,这里会调用到505行的_addTask(),重要的是516行,赋予线程所要做的任务。

 

上图是线程运行函数中的一段,可以看出线程会对所收到的task进行processTask处理(674行),处理完毕之后会将处理完成的task放到finiTaskList_(这一段没有截出最后一个处理任务的存放过程,但都是处理完成放到finiTaskList_)。

 

processTask调用的是task的process(),而对于DBTask(数据库任务),process()又会调用db_thread_process()(这里为了节省时间,就不再贴图)所以这里会调用的是DBTaskAccountLogin::db_thread_process(),这个函数主要就是去数据库查询账号密码。

DBTaskAccountLogin::db_thread_process()的最后部分

查询完毕了,接下来该怎么走呢?

 

想想kbengine(服务端)说到app.run是一直在近乎死循环运行的,要接着处理八成是在这个近乎死循环的地方进行处理。

 

去看循环

我们沿着processUntilbreak的processTimers()再到triggerTimer(),在triggerTimer()第249行,调用了handler的handleTimeout(),这个handler是Dbmgr(在初始化中可以找到)

handleTimeout中调用的是handleMainTick(),然后再调用DBUtil::handleMainTick(下图所示)

可以看到DBUtil::handleMainTick(),会逐个调用线程池的onMainThreadTick()

线程池会逐个调用线程池中每一个任务的presentMainThread()

我们加入的task是DBTaskAccountLogin,所以要调用DBTaskAccountLogin的presentMainThread()。

可以看到这里将DBTaskAccountLogin::db_thread_process()处理的结果都发送到给loginapp,并且调用LoginappInterface::onLoginAccountQueryResultFromDbmgr

 

Loginapp::onLoginAccountQueryResultFromDbmgr

这里主要干的事是:

将请求给脚本层进行处理

到baseapp上进行注册

 

Baseappmgr::registerPendingAccountToBaseapp

608行会找到负载最低的baseapp,其id是bestBaseappID_。

647行具体的注册在该baseapp上进行

 

Baseapp::registerPendingLogin 会将登录信息保存在ptinfos,后续客户端直接连 baseapp 时需要靠这个注册信息来进一步验证。

3703行再次转到basemgr,并且带上本baseapp的地址

 

这里的处理就是将登录信息和baseapp的地址给loginapp

(不太明白这里为什么baseapp不直接和loginapp通信,为什么要转到basemgr)

 

走了一圈之后,回到了loginapp。

1313行找到客户端的channel,并调用onLoginSuccessfully,指定这个消息由客户端的 onLoginSuccessfully 来响应,客户端的 Client_onLoginSuccessfully 函数将被调用

 

查看客户端

Kbengine.cs

906~908记录了baseapp的相关信息,914行登录baseapp,以后就是通过baseapp进行通信来处理任务

 

如此,一个登录的流程就正式完成。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值