欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-08 08:22:54
上文说到流程到了Loginapp::login(),那么登录操作到了这里接下来会怎么走呢?往下看Loginapp.cpp996~1003:请求交给脚本操作1096~1100 会将用户名和密码交到Dbmgr上进行查询找到Dbmgr::onAccountLogin()105行将任务交给了数据库线程池。那么数据库线程池是怎么回事呢?以下虚线部分都是线程池的内容,如有了解可以跳过------------------------------------......

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


Loginapp.cpp

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

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

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

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

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


找到Dbmgr::onAccountLogin()

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

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

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

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


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

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

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


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

db_interface.cpp

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


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

db_interface.h

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


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

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

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


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

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


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

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


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

DBTaskAccountLogin::db_thread_process()的最后部分

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

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


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


去看循环

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

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

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

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

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

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

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

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

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

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

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

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

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


Loginapp::onLoginAccountQueryResultFromDbmgr

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

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

这里主要干的事是:

将请求给脚本层进行处理

到baseapp上进行注册


Baseappmgr::registerPendingAccountToBaseapp

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

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

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


Baseapp::registerPendingLogin kbengine unity3D 登录分析(初次登录流转过程)会将登录信息保存在ptinfos,后续客户端直接连 baseapp 时需要靠这个注册信息来进一步验证。

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


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

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

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


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

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

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


查看客户端

Kbengine.cs

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

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

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

本文地址:https://blog.csdn.net/zzpzm/article/details/107865834

相关标签: kbengine c++