- 博客(42)
- 收藏
- 关注
原创 QT聊天项目DAY12
注册逻辑中的密码哈希加密,并添加获取验证码的倒计时,可以锻炼自己的自定义控件水平;验证注册的输入是否合理主要是回调的检验逻辑;采用qss并且自定义标签,重写事件的方式来刷新标签的UI,而不是采用PaintEvent事件来切换UI,思路值得学习;注册成功的界面切换以及测试;
2025-05-23 21:02:12
644
原创 QT聊天项目DAY11
客户端发送注册请求,服务器处理注册,将注册信息写到Mysql中,为了更大利用性能使用Mysql连接池,学习使用存储过程,处理注册服务的一系列bug
2025-05-18 17:40:03
1103
原创 QT聊天项目DAY10
封装redis连接API,为了充分使用多线程的优势采用redis连接池避免事件循环中服务器往redis数据库里写东西的资源竞争,以及只有一个连接导致的性能颓势
2025-05-09 22:15:59
708
原创 QT聊天项目DAY09
安装redis到windows,以及编译redis库。记录自己解决docker安装redis的坎坷经历,顺便梳理一下整个逻辑。最后是连接redis库
2025-05-07 21:24:23
1416
原创 QT聊天项目DAY07
protobuf的语法版本 为 proto3定义当前的包名为message定义一个服务 VerifyService输入参数类型为 GetVerifyRequest返回值类型为 GetVarifyRsponse请求的参数结构为返回的参数结构为错误码 邮箱 和 验证码也就是这个.proto文件定义了一个基于gRpc的邮箱验证码服务接口,前端调用GetVerifyCode发起验证码请求,后端通过邮箱发出并返回结果,通信数据用Protobuf编码。
2025-05-04 17:15:53
735
原创 QT聊天项目DAY04
所以拷贝构造就是复制对方的引用,双方都可以管理同一片内存地址(浅拷贝)或者复制资源并另外创建一片新的内存空间(深拷贝),移动拷贝就是将对方地址拿过来自己用,并将对方从原地址迁移出去;如果对方不能对自己取地址可以直接触发移动拷贝构造,直接接管对方的内存资源,如果对方可以对自己地址则需要使用std::move()将左值变为右值并接管对方的资源。参数这种东西是记不住的,也没必要去记,反而报错类型好记,一般像模板实例上下文这样的,就是参数不匹配,问一下AI正确的参数类型是什么,补上就完事了。
2025-04-18 00:06:25
1009
原创 QT聊天项目开发DAY02
这两段代码其实是等价的,这就为同一个对象创建了第二个控制块,导致他们的引用计数都为1,造成了二次析构。使用条件极为苛刻,只有当该对象被Shared_Ptr管理时,才能够正常的使用,否则会报错。std::enable_shared_from_this正是为了解决这个问题而存在。即有多少个shared_ptr 共享该资源)每一个Shared_ptr 维护一个。
2025-04-13 23:31:10
829
原创 如何灵活使用增强输入系统与GAS框架
2.绑定增强输入系统,通过行为绑定技能,输入上下文来绑定行为和按键的关系,行为和行为之间可以互相管理,在行为触发时会调用对应的回调函数,在一开始就绑定了技能的标签作为回调函数的入参,在回调函数中通过技能系统组件来遍历注册到技能系统组件中的技能,最后来找到这个捆绑这个标签的技能最后触发该技能。3.定义行为,并在输入映射上下文中绑定与按键的映射关系,在角色初始化时注册该上下文到增强输入系统中。在角色类被控制器控制时,加载技能系统的资产来注册技能到技能系统组件下。至此GAS简易框架和增强输入系统已经构建完毕。
2025-04-10 10:33:57
206
原创 TPS入门DAY02 服务器篇
没搜到,没关系,可能这个关键字就不是头文件命名,在搜索UserWidget。直接将UMG添加到build.cs下即可。其实就是VS下的筛选器的名字。
2025-04-06 21:45:28
347
原创 虚幻FPS开发 day02:开枪以及光线追综
首先设置音效资产变量,在蓝图中动态的设置音效资产绑定开火事件,在输入事件中设置鼠标左键按下事件在代码中设置当鼠标左键按下时对应的槽函数,绑定输入事件和槽函数之间的关系获取开火资产GitHub - DruidMech/UE4-CPP-Shooter-Series: Unreal Engine C++ Shooter Series Project创建音效蓝图在BP_Character中设置资产至此,开火音效已经实现首先创建开火粒子特效变量以动态绑定资产,在我看来蓝图类就像是配置文件在鼠标左键点击开火时调用的回调
2025-03-13 19:36:17
490
原创 DAY09
此时将叔叔结点和父亲节点都设置为黑色,将祖父节点设置为红色,将祖父节点设置为当前结点,一直向上递归,直到祖父节点是红色(当前节点)。红黑树有一条性质是不能有两个连续的红色结点,因为插入的新结点是红色,所以其父亲结点不能是红色结点,如果是红色结点就需要做调整,而黑色结点不需要。其次保证当前指向结点的指针不能是黑色,因为插入的结点是红色的,如果当前的结点是黑色的,就意味着不会影响黑高也就没必要再网上递归了。// 将当前结点设置为祖父节点,下面的两层已经检查完毕,需要递归的向上检查。// 将祖父结点染成红色。
2024-09-30 22:25:32
795
原创 DAY08
创建了监听端口的socket,并将其作为事件添加到红黑树上监听以后,当epoll监听到连接请求,就往socket_server中添加新的socket,此时socket线程会通知gate服务的次级消息队列,插入一个消息,告诉它有新的连接建立。这个消息队列有两级,二级消息队列是供用工作线程调用的,一般工作线程会出队一个消息队列,然后从这个消息队列中出队一个消息(根据工作线程的权重来出队消息的个数),并找到该次级消息队列的所属服务,将消息当作该服务的callback函数的参数,来执行指定业务。
2024-09-27 20:22:46
796
原创 DAY07
还是利用了先划分服务的特性。离谱,长记性了,下次面试之前,先问一下公司的产品和规模,不能再这么傻乎乎的过去了。大致逻辑是这样子的,重要的是熟悉lua定义的一些常用的数据结构,然后明白这些表中到底是存放什么信息,可以将整个代码赋值给gpt让gpt分析每个数据结构包含的信息和作用,然后自己再根据这个数据结构去看代码,会更加的清爽。猜数字的逻辑也是在room中进行实现的,因为a玩家猜的数字要在b玩家和c玩家的界面上显示,所以就需要有一个服务拥有这三个服务的信息然后将某个服务的操作统一的投射到输出缓冲区上。
2024-09-26 22:28:55
240
原创 DAY06
大致的思想就是在.lua文件中调用socket.start传递的两个函数参数,都会加入到虚拟栈中,由于c和lua共用虚拟栈,所以c的代码中就需要从这个虚拟栈中获取两个元素,就是616和617的函数,这个L就是虚拟栈(暂时可以这么理解)。暂时没有什么好的学习方法,只有死磕,将一小段代码拿出来,写个test.lua文件测试一下,看看效果,再根据效果去推理每个代码的意思,再让gpt生成一下注释,就大致明白了。之前的框架自己已经清楚了,但是最重要的还是要使用这个框架来写代码。这就是在lua中调用c的大致逻辑。
2024-09-25 22:09:26
326
原创 DAY05
一般绑定的是读事件,重点是第二个data种void* ptr可操作空间很大,可以针对客户建立连接的事件创建一个结构体来操作这个专属连接,在这个结构体可以设置一个回调函数,当事件被触发就可以执行回调。由于已经建立的客户端连接的事件是一个比较宽泛的概念,所以再这个事件到来时可以在这个逻辑里面进行类型判断,在对这个事件进行细分,例如上传文件,下载文件之类的。所以说要想看懂一个网络模型,重点是注册了几个事件已经对事件的处理,在事件的处理中有哪些是进行了线程池添加消息的操作,就能有个比较大致的思路了。
2024-09-24 22:12:53
173
原创 DAY04
今天的重头戏还是skynet的架构,该架构的核心actor模块,其包含三个数据结构,虽然源码中有10个数据成员,但是真正核心的只有消息队列,回调函数以及lua虚拟机。今天学到了一个看skynet架构的思路,先从线程池的入口函数看起,然后看线程都执行那些类型的消息,再从消息回溯看actor结构,然后去看actor是如何和事件进行绑定的,即客户端的连接绑定一个actor,进而到epoll监听到事件然后到注册了哪些事件类型,再去main.lua看哪些事件被执行了,这样看下来整个架构会清晰很多。
2024-09-23 22:07:10
362
原创 DAY03
后面就是算法,二叉树的前序遍历,中序遍历,后序遍历,都是采用栈的形式,前序和后序差不多将根节点先入栈,然后调用一个while循环判断栈不为空,出栈,将该结点添加到vector中。层次遍历说起来更符合人的思维,即用一个队列,将第一层的结点添加到队列,再while中先获取队列的长度,出队列将结点的左右孩子依次添加,第一层出队完毕,就到了第二层,依次往下。然后又看到了几个有意思的面试题,互斥锁和自旋锁的区别,一个需要上下文切换,一个不需要,因为太晚了有些着急回去了,还有TCP和UDP以及函数重载的原理。
2024-09-22 22:17:05
450
原创 DAY02
有复习了一些,new和malloc的区别,只记了两个应该够用一个new能返回有类型的指针,但malloc只能返回void*,另一个是new能调用构造函数,创建对象,例如再堆上创建对象以及delete调用析构函数,说到析构函数,它是可以也必须要当作虚函数的,如果用基类指针指向派生类对象,不设置虚函数就无法事件派生类的析构函数的覆盖,调用派生类的析构函数进而能调用基类的析构函数不会出现内存泄漏的情况。c++11的新特性,范围for循环,auto,智能指针,移动语义,bind和function用于回调。
2024-09-21 19:20:00
326
原创 DAY01
现在我的c++代码量接近2w行左右,八股文和一些简单的STL容器能用的熟练,能根据业务场景将代码磨出来。一直在找工作,由于是应届生的原因,工作不是特别好找,现在身处广州,游戏服务器方向的岗位还是蛮多的。还有快排,二分查找,一些常用的数据结构,都要掌握,虽然我都实现过,但现在难免有些稀松,一定要达到随写随敲的程度。从现在开始,不要再焦虑,不要再陷入无效的忙碌,踏实下心来从头学点东西吧。之前一直用BOSS投简历,一点学习的状态都没有,总是消耗在无效的忙碌上面,基本上上午的时间都莫名奇妙的消失掉了。
2024-09-20 13:44:50
240
原创 即将迈入社会的应届生非科班转码学习心得
值得强调的是格式中第一个类看你想要的返回值类型而确定,而括号中的类视实际情况而定,我目前做题目只遇到过相同的类的对象A与B相加和相乘的运算。每个非静态成员函数只有一份函数实例,上文也提到了静态是大家共享的,非静态一段时间只能有一个对象访问,也就是多个同类型的对象公用这一份代码。this指针指向被调用的成员函数所属的对象,它是隐含在每一个非静态成员函数中的一种指针,不需要定义直接使用。class A和class B这两个类,在A中调用B,直接使用你定义的类“B”这个名称,声明一个新的变量。
2024-03-25 09:47:53
1262
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人