高效消息处理系统设计
大部分的后端系统依赖于大量的消息处理实现各种功能服务,架构高效的消息处理系统是非常有必要的。这里笔者简单记录下日常开发常用的高效消息处理系统的设计思路。 设计消息处理系统时,我们要明确三个角色: 消息生产者:产生消息的对象(接收到来自网络中的数据包,解析适配成系统内部消息,这种角色称为消息生产者) 消息消费者:消费消息的对象,也就是service。接受消息提供服务。 消息分发...
定时器系统和层级时间轮技术细节和linux下常见的定时器相关接口
常见的定时器相关接口 / 创建epoll循环驱动的定时器 任何定时器系统,不管是任务队列型定时器,还是时间轮定时器系统,都必然需要一个底层的待回调的高精度的定时器作为驱动。这里给出在Linux下的基于事件循环驱动的毫秒级定时器。 #include <sys/epoll.h> #include <sys/timerfd.h> #include <unistd....
关于网络同步的经验与思考
前言 截至目前,笔者也接触了一些游戏项目的开发,接触过一些网络同步方案,在这里做个总结以及提出一些自己的思考。笔者目前接触的网络同步方案大致划分为三种:快照同步、状态同步和帧同步。具体采用什么方案,需要根据游戏需求以及服务器的架构需求来指定,而不是盲目的选择。 快照同步 这是笔者接触比较多的同步方法,也是三种同步方案中最为简单的。快照同步常用于逻辑简单的游戏,多为房间类型的休闲游戏,卡牌...
时间轮--MMO服务器开发技术点记录
ksm快速幂算法
差分数组 差分数组的作用是用于频繁的对某个区间的数组进行加减。比如说,我给你输入一个数组 nums,然后又要求给区间 nums[2..6] 全部加 1,再给 nums[3..9] 全部减 3,再给 nums[0..4] 全部加 2,再给…。一通操作猛如虎,然后问你,最后 nums 数组的值是什么? 差分数组如何构造 vector<int> nums; int n = num...
属性同步--MMO服务器开发技术点记录
在MMO游戏中,玩家实体必然存在大量的状态,这些状态被称为属性状态,如hp、mp、攻击力、防御力等。不同的实体的组件会影响到这些属性状态的值,需要进行同步。不能说在每次修改某位玩家实体的属性状态后就要发送一个rpc去通知客户端。每个属性的变化都去进行一条rpc的通知,在实现上也是比较麻烦。 比较好的方案是提供属性同步功能,当属性状态发生改变时,就主动地通知; 属性同步设计 属性同步分为...
AOI--MMO服务器开发技术点记录
对于AOI的详细原理,可以具体参考我这篇博客:AOI; 本篇文章我们的重心是放在如何将一个基本的AOI系统实现进我们的MMO服务器。 可以把一个AOI系统当作一个运行在服务器中的虚拟的场景,玩家实体在其中表现为一个AOI实体。AOI实体的结构如下: struct AOIEntity { uint32_t id; Vector3 position; Vector3 d...
求解同余方程
同余方程求解方法 同余方程的一般形式为: [ ax \equiv b \pmod{m} ] 其中,(a, b, m) 是已知整数,(x) 是未知数。我们需要找到所有满足该方程的整数 (x)。 求解步骤 检查是否有解: 计算 (d = \gcd(a, m))。 如果 (d \nmid b)(即 (b) 不能被 (d) 整除),则方程...
数据流动态中位数查询器
#include <bits/stdc++.h> using namespace std; // 数据流动态中位数查询器 class MediumFinder { public: priority_queue<int> small; // 大根堆 priority_queue<int, vector&l...