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进行通信来处理任务
如此,一个登录的流程就正式完成。
本文地址:https://blog.csdn.net/zzpzm/article/details/107865834