![](https://img-blog.csdnimg.cn/20190918140213434.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
游戏后台开发
游戏后台开发
Ftworld21
专注游戏开发。
展开
-
Scene场景设计
//场景上的物体struct SceneEntry{ friend class SceneEntryIndex; public: //物体类型 enum SceneEntryType { SceneEntry_Player, /**< 玩家*/ SceneEntry_NPC, /**< NPC*/ SceneEntry_Build, /**< 建筑*/ Sc...原创 2021-09-14 10:51:47 · 260 阅读 · 0 评论 -
rpc简介
https://www.zhihu.com/question/25536695https://github.com/button-chen/buttonrpc_cpp14/blob/master/buttonrpc.hpp原创 2021-08-25 16:23:20 · 85 阅读 · 0 评论 -
休眠延时函数
time包,time.Sleep函数https://blog.csdn.net/whatday/article/details/102637905原创 2021-05-15 21:30:01 · 149 阅读 · 0 评论 -
线上事故(四)
线上场景服10分钟内连续重启几次,日志输出在某时刻后中断了,最后查出来问题是因为磁盘满了,清理一下日志,同时控制导致磁盘空间快速减少的日志输出。原创 2021-02-09 12:28:36 · 92 阅读 · 0 评论 -
线上事故(三)
数据清理发生在场景服上,通过功能服转发消息进行触发,在消息触发前,玩家跳场景服,能够重复领取奖励。发生这种问题的根本原因在于没有等待功能服返回确定完成数据清理后再进行操作,但是玩家跳场景也是无法预计的,只能把数据清理的触发流程设置在场景服上而不是转发,或者数据只在需要用到的场景服上存储,而不是所有的场景服。...原创 2021-02-07 18:43:48 · 90 阅读 · 0 评论 -
线上事故(二)
使用复杂类型的结构,里面包含了结构体类型,proto协议等。把改变过的复杂类型的数据结构指针指向强转过后的老的数据结构体指针,导致数据没有对齐,解析不出来最后定义的proto数据,最终宕机了。...原创 2021-02-01 14:33:37 · 90 阅读 · 0 评论 -
A星算法
游戏里面的寻路算法很多都是使用A星寻路算法,参考资料:https://www.cnblogs.com/zhoug2020/p/3468167.htmlhttps://blog.csdn.net/m0_37290785/article/details/93203624原创 2021-01-23 22:35:00 · 147 阅读 · 0 评论 -
功能测试
111原创 2021-01-19 12:02:32 · 67 阅读 · 0 评论 -
线上事故(一)
线上功能遇见内存泄漏事故,原因是由于STL容器使用不当。内存泄漏对于c++程序员来说可能是一个老生常谈的问题了,当项目工程比较庞大复杂时,很容易产生内存泄漏问题。程序发生内存泄漏通常第一时间会联想到指针所指向的内存没有释放,从而会去关注代码里面所用到指针,进而去一一排查指针,追踪内存泄漏的原因。这种思路没有问题,也能查出来大多数的内存泄漏问题。但是对于c++程序员来说,使用STL标准库会比较多,使用STL容器不当也会造成内存泄漏问题,如下例所示,所以对于容器的使用还需小心谨慎!!!#include &l原创 2021-01-13 18:29:40 · 186 阅读 · 0 评论 -
登陆流程
玩家在游戏客户端上点击登陆操作后首先会连接flserver服务器,如果验证通过会给客户端返回玩家所在网关gatewayserver,接着客户端会连接gatawayserver,验证通过后gateway会去连接recordserver,recordserver验证通过后,就会把玩家信息加载到redis中,并且给客户端返回一些账号基本信息,比如创建的角色等等。然后玩家再到场景服scenesserver上登陆,根据redis中的玩家信息创建相应的玩家对象等,然后再发消息到功能服创建玩家对象等依次创建不同服务器实例原创 2020-12-30 18:49:05 · 269 阅读 · 0 评论 -
加密算法
客户端与服务器之间的消息进行加密是很有必要的,可以防止外挂与攻击。常常使用encdec/encdec.h提供的des加密算法,使用方法为声明一个CEncrypt对象然后调用encdec即可。原创 2020-12-30 18:29:08 · 169 阅读 · 0 评论 -
游戏服务器消息处理架构
现代游戏服务器消息处理架构一般采用异步-固定多线程方式(reactor网络模型),其他方式还有同步-动态多线程,同步-多线程池,异步-单线程等。游戏服收到客户端的消息后,通过网关转发到不同的逻辑服务进程中,例如功能服,场景服,这些服务进程收到消息后,会把它们放在一个无锁环形队列中,主逻辑线程会去这个队列中读取消息,然后通过消息分发器把消息派发到不同的处理流程中。参考资料:https://blog.csdn.net/mergerly/article/details/77985141https:原创 2020-12-30 18:15:12 · 392 阅读 · 0 评论 -
一种读取xml配置的方法
如果对于每个xml文件都去写个读写方法,代码将会显得非常冗余和臃肿,可以设计一种更优雅的读取方法,例如有如下格式的xml文件:可以通过python脚本转换为带有struct结构体类型的c++代码,例如:其中DymType类型在前文动态类型中有介绍。这样通过形如test().test1()的格式就可以很方便读取配置了。...原创 2020-12-27 18:52:33 · 197 阅读 · 0 评论 -
一种读取excel表格配置的方法
游戏中会涉及非常多的数值,假如这些数值可以由excel表格来进行配置就会非常方便。介绍一种读取excel表格配置的方法。例如有以下一种表格:借助于一个xml辅助文件来进行解析:最后生成proto文件:这种方法主要是通过python解析程序来解析xml文件,从而生成test.proto,最后生成test.tbx数据和相应的读取test.tbx的代码来实现的。...原创 2020-12-27 12:24:04 · 221 阅读 · 0 评论 -
机器人
机器人实际上就是npc赋予了AI的功能,游戏里面的AI可以使用状态机来实现,把召唤出来的npc存在一个容器里面,然后每毫秒遍历一下容器里面每个npc,根据npc的状态,让它执行不同的操作:switch(state()){case NORMAL: //AI的主要逻辑在这里实现do_normal_action(...);...break;case DIE:...break;case HIDE:...break;}do_normal_action(...)原创 2020-12-26 23:27:47 · 144 阅读 · 0 评论 -
定时器
和计数器一样,定时器也是游戏服务器里一个非常重要的功能。在游戏服务器代码中随处可见,它的实现没有想象中那么复杂,可以说是比较简单了,核心的思想就是重载了(),也就是函数对象,用法如下:static Timer test_timer;Timer TestTimer::test_timer(60); //一个60秒的定时器if (test_timer(nowtime)){//执行定时60秒每次的操作}而Timer类里面主要包含了一个封装了timespec,clock_gettime等系统时间原创 2020-12-25 19:38:53 · 90 阅读 · 0 评论 -
坐骑
设计一个坐骑类管理来管理坐骑类,坐骑管理类管理了各种不一样的坐骑,坐骑类又包括这个坐骑的一些属性等。这种类的设计方法在很多功能中都出现过,叫做pimple模式。坐骑还包括坐骑包裹(用来存放坐骑装备),所以需要一个坐骑包裹类来管理坐骑包裹。坐骑需要显示不同的外形,所以还需要一个类来管理坐骑图鉴。...原创 2020-12-24 18:08:41 · 177 阅读 · 1 评论 -
官阶官职系统
官阶:官阶系统实际是通过完成各种任务来获取功勋,然后根据功勋来晋升到一个官阶,官阶又可以激活对应的称号。不同的官阶还可以通过功勋兑换不同的奖励。只需要实现一个玩家身上的功勋管理类即可。官职:官职系统是国家的官员,包括国王等。不同官职的玩家具有不同的职能,在功能服上实现一个管理国家官员的类,任免官员时需要把信息同步到场景上。这样场景根据信息也实现一个管理国家官员的类。...原创 2020-12-23 18:55:31 · 429 阅读 · 0 评论 -
装备系统
装备系统和打造系统息息相关,打造完装备后,需要把装备装上,才能有用,对玩家属性值产生影响。把装备装上的过程其实就是把装备从背包里删除,移到装备背包,然后再重新计算属性的过程。...原创 2020-12-23 18:06:40 · 121 阅读 · 0 评论 -
打造系统
打造的基本流程都是打造完装备后,装备直接进背包。所以打造一件装备,可以看做是往背包里面添加一件装备,然后再走打造流程。其次装备也是一件道具,打造流程首先走创建道具的流程,道具创建成功后,再逐步根据装备所具有的属性逐条给它加上。由于打造系统是一个通用的系统,要求能够打造不同类型的装备,并且还能打造不同系别的装备等,且装备属性往往比较多,所以整体来说代码量较多,较为复杂,需要几个类分工协作来完成。...原创 2020-12-23 17:27:05 · 120 阅读 · 0 评论 -
组队
功能服上创建一个管理类来管理所有的队伍类,并且把创建队伍,删除队伍,加入队伍等信息也同步到场景上,同样的场景上也创建一个管理类来管理所有的队伍类。一个队伍类用来管理队员相关处理,例如队员上下线的处理,队员信息等。...原创 2020-12-22 11:43:34 · 89 阅读 · 0 评论 -
答题系统
答题是一个常见的玩法,玩家可以在房间里面答题,玩家之间可以相互使用技能,例如混乱、双倍答题积分等。在功能服上创建一个房间管理器管理所有答题的房间,然后根据需求逐步实现即可。...原创 2020-12-21 17:08:09 · 263 阅读 · 0 评论 -
代练系统
和限时类活动开发类似,首先弄一个代练活动的类,用于管理一个活动的相关信息,例如代练的开始时间,当前活动的状态等。然后再弄一个管理代练活动的类,用于管理玩家可以代练的多个活动。对于这种涉及多个活动的功能主要是设计出来一个比较合适的代码框架,然后往里面填逻辑代码即可。...原创 2020-11-27 15:51:00 · 426 阅读 · 0 评论 -
安全锁
玩家可以给自己的账号上安全锁,锁定以后登录游戏时,无法打开背包以及对装备进行改造等操作。玩家点击忘记密码后,锁会在3天后自动删除。这里涉及到的状态会比较多,比如锁的状态,包括上锁,解锁,解锁过程中等。编码流程较为简单,只需要按照功能一个一个实现即可。...原创 2020-11-27 12:14:41 · 143 阅读 · 0 评论 -
游戏设置
游戏里面常常会有一些设置,比如设置是否可以被观察装备,设置一些操作习惯等等。这种设置可以在服务端实现,也可以在客户端实现。服务器实现就是客户端上每次选择一种设置后就给服务器发消息,服务器收到设置信息后保存一下即可。服务器保存配置的好处就是每次都能读取到玩家的设置信息,即使玩家删除掉游戏后再下载。客户端实现的话假如是cocos2d,主要是使用UserDefault类来做的,它会把配置信息保存到一个xml配置文件中。参考资料:https://blog.csdn.net/qq_37233607/art原创 2020-11-26 18:34:10 · 980 阅读 · 0 评论 -
战令类活动
battlepass战令是去年火起来的一个玩法,主要是玩家参与游戏中的一些活动获得相应的进度,根据进度可以获取阶段奖励。关键的就是要实现活动任务的计数,可以事先定义一些活动类型(以备复用),完成相应的活动后就计数。...原创 2020-11-24 19:39:34 · 162 阅读 · 0 评论 -
PK模式
PK模式可以分为和平,国家,帮会模式等。不同的PK模式可以具有不同的攻击对象。PK模式存在玩家身上即可,上线的时候同步给客户端一下,或者更改PK模式的时候同步给客户端一下。原创 2020-11-23 18:57:00 · 450 阅读 · 0 评论 -
docker的使用
docker可以节省内存,并且在不同docker里面的服务器之间是独立的,且共享同一台母机。(1)切换为root模式(2)把local_mirror.repo拷贝到/etc/yum.repo.d/目录下(3)安装dockeryum install docker-ce-selinux-17.03.0.ce-el7.centos.noarch.rpmyum install docker-ce-17.03.0.ce-1.el7.centos.x86-64.rpm(4)执行systemctl start原创 2020-11-23 18:07:59 · 116 阅读 · 0 评论 -
多套装备处理
玩家可以多套装备,且可以在多套装备之间进行切换。用于管理玩家换装的类可以当做玩家类的一个子类,所用到的数据直接保存在玩家身上。换装处理主要涉及到切换装备时,不仅需要卸下当前装备换上另外一套装备,还要切换相应的人物技能,法宝技能等,还要涉及到相关数据的同步与保存。...原创 2020-11-23 15:40:13 · 66 阅读 · 0 评论 -
回档处理
部分回档:回档的思路为玩家上线的时候检查回档,当临时数据库里面有玩家数据时候,则使用该份数据进行回档恢复(只需要加载需要回档部分的proto即可)。小回档:大回档:原创 2020-11-17 18:01:57 · 345 阅读 · 0 评论 -
日志系统
之前老的游戏服务器一般都是用的log4cpp日志库,但是这个库并不是线程安全的,需要自己在log4pp的基础上加锁去实现线程安全的日志库。其他的开源线程安全的线程有libslog等。在实际的游戏服务器开发中,会在log4cpp等日志库再做一层封装,比如会加上和某个程序员相关的作者信息,test->debug(),就是表示test这个程序员加的个人日志,test1->debug()就是表示test这个程序员加的个人日志。参考资料:https://blog.csdn.net/u01343原创 2020-09-27 17:09:02 · 142 阅读 · 0 评论 -
TCP服务端任务
TCP服务端任务定义了一个任务类,是TCP服务端任务线程池的基本工作单元。class TCPServerTask : public handler, private Nocopy{public: enum State { close = 0, //连接关闭 sync = 1, //等待同步 ready = 2, //连接准备好 destroy = 3 //连接退出 }; bool send_cmd(....原创 2020-09-25 17:11:03 · 136 阅读 · 0 评论 -
TCP服务端
TCP服务端封装了服务器监听模块,使用此类可以方便的创建一个服务端对象,用于绑定套接口,接收网络连接。class TcpServer : private Nocopy{public: TcpServer(const std::string &server_name); ~TcpServer(); bool bind(const std::string &server_name, const unsigned short server_port); in...原创 2020-09-25 16:21:04 · 204 阅读 · 0 评论 -
自旋锁
和互斥锁(sleeping-waiting)不一样,自旋锁是一种busy-waiting锁,它的使用流程和互斥锁基本一致。主要包括:1.在构造函数中调用pthread_spin_init,析构函数中调用pthread_spin_destroy。2.使用pthread_spin_lock加锁,使用pthread_spin_unlock解锁。在游戏里开发中,循环队列push和pop操作中可能会使用到。参考资料:https://www.cnblogs.com/zendu/p/5387596.h原创 2020-09-22 14:50:09 · 90 阅读 · 0 评论 -
TCP客户端任务线程池
TCP客户端任务线程池,主要封装了一个线程处理多个连接的线程池框架。用到了前文提到的TCPClientTask类。class TCPClientTaskPool : private Nocopy{public: bool insert_task(TCPClientTask* task); void remove_task(TCPClientTask* task); TCPClientTask* get_task(std::string&ip, int port);...原创 2020-09-21 16:49:09 · 366 阅读 · 0 评论 -
TCP客户端任务
TCP任务客户端主要封装了一些TCP客户端的逻辑,包括建立连接等。这个类和TCP客户端比较类似,区别主要为多了一些状态相关的变量(关闭,同步,准备好,销毁等)变量等。class TCPClientTask : public handler, private Nocopy{public: enum State { close = 0, //连接关闭 sync = 1, //等待同步 ready = 2, //连接准备好 dest...原创 2020-09-18 16:11:25 · 109 阅读 · 0 评论 -
TCP客户端
TCP客户端主要封装了一些TCP客户端的逻辑,包括建立连接等。//定义了处理消息的接口,通过这个接口来处理所有收到的TCP数据class Handler{public: virtual bool parse_msg(...) = 0;};class TCPClient : public Thread, public Handler{public: bool connect(); virtual bool send_cmd(...); virtual voi...原创 2020-09-18 15:43:16 · 442 阅读 · 1 评论 -
TCP套接字
TCP套接字类主要对底层的读写,压缩,加密等进行了封装,提供了一个比较通过的接口,通过这个类就可以实现数据的接收与发送。//封装了一个缓冲区,用于TCP套接口接收到发送的缓冲区template <typename T>class Buffer{public: ...private: ... T buffer;};typedef Buffer<std::vector<unsigned char> > Buffer_t;clas...原创 2020-09-18 12:31:12 · 198 阅读 · 0 评论 -
服务器进程依赖关系
服务器进程之间的依赖关系即服务器进程的启动顺序,由管理服务器进程来协调它们之间的启动。假如A依赖于B,那么B应该先启动,如果B尚未启动,那么A应该暂停启动流程,等待B启动。B在启动的时候会通知管理服务器自己已经启动,管理服务器进程再通知A,B进程已经启动,A收到消息后继续启动流程。一般来说服务器进程之间的依赖关系如下:sessionserver -> recordserversceneserver -> recordserver, sessionserver, functionser原创 2020-09-17 17:51:00 · 658 阅读 · 0 评论 -
消息的定义
服务器进程之间会有大量的消息,如何有条例的定义消息是一个比较重要的问题。一种思路是按照每个服务器进程收到的消息进行区分,例如:#pragma pack(1)namespace MyCmd{ namespace FunctionCmd //表示function收到的消息,类似的可以定义scene收到的消息等。 { namespace Cmd { enum { min_func_cmd...原创 2020-09-14 16:26:04 · 1013 阅读 · 0 评论