AOI--MMO服务器开发技术点记录(十)
对于AOI的详细原理,可以具体参考我这篇博客:AOI; 本篇文章我们的重心是放在如何将一个基本的AOI系统实现进我们的MMO服务器。 可以把一个AOI系统当作一个运行在服务器中的虚拟的场景,玩家实体在其中表现为一个AOI实体。AOI实体的结构如下: struct AOIEntity { uint32_t id; Vector3 position; Vector3 d...
对于AOI的详细原理,可以具体参考我这篇博客:AOI; 本篇文章我们的重心是放在如何将一个基本的AOI系统实现进我们的MMO服务器。 可以把一个AOI系统当作一个运行在服务器中的虚拟的场景,玩家实体在其中表现为一个AOI实体。AOI实体的结构如下: struct AOIEntity { uint32_t id; Vector3 position; Vector3 d...
图大致分为两类:有权图和无权图。 普通的bfs遍历能够直接找到无权图的最短路径。 对于有权图,bfs并不能直接找到最短路径,这时需要使用dijkstra算法。 dijkstra算法的基本思路是:维护一个最小堆,每次从中取出一个距离最小的点,然后更新它的邻居节点的距离,直到所有点的最短路径都被找到。 int bfs(vector<vector<int>> &...
同余方程求解方法 同余方程的一般形式为: [ 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...
技能系统可以单独开发个组件。下面来介绍一下常见的CombatComponent的设计思路。和移动组件一样,技能组件的同步同样需要进行插值、预测。 我们的技能系统先设计的简单些,只有普攻和特殊技能。 普攻 普攻的执行逻辑是这样的: 客户端发起普攻请求,包含目标信息和技能信息,同时本地播放普攻动画; 服务端接收到请求后,进行合法性校验,执行普攻逻辑; 服务端生成攻击事件,并将...
Service / 服务 服务器其实也可以称为一个服务,为客户端提供某些功能。通常一个服务会运行在一个端口上供客户端访问。像下面我们要深入的场景服务,是一个独立运行的单点服务。游戏服务器涉及的服务通常还包括登录服务,大厅服务等。服务类继承自TcpServer类,属于应用层,与网络层解耦开来。这里可以设计一个连接器的接口,实现服务可以自定义所需的通信协议,如TCP、UDP、Websocket...
状态同步 网络同步是服务器开放老生常谈的技术点,也是MMO游戏中至关重要的一环。它确保了所有玩家在同一场景中的状态一致性,使得玩家之间的交互能够实时反映在游戏世界中。网络同步方案大致分为两类:帧同步和状态同步。关于帧同步,可以参考这篇博客帧同步 本篇主要讲解在我们的MMO服务器中,状态同步是如何实现的。 在ECS架构篇中,我们讲到游戏系统由多个实体组成,实体内由多个组件组成。不同玩家实...
联想这样的场景,在联机游戏中,其他玩家会在它们的场景中看见我的角色,我会我的场景中操纵我的角色。如果要实现两个客户端之间的移动同步,我们需要在服务器也创建一个同样的角色。这样同一个角色就存在三个不同的实例,任意一个实例的状态变化都需要同步到另外两个实例。这个思路类似于UE引擎中的NetRole。我们假设这三个实例的角色分别为: enum class Role { authority...
了解完ECS架构后,我们先来设计我们的第一个实体,玩家实体。 Player / 玩家实体 玩家实体继承于实体类,表示场景中的玩家,可以是当前操作的玩家,或者联机下场景中的其他玩家,也可以是npc或者敌人。 玩家实体的ID随机生成,初始化的玩家拥有四个组件: MovementComponent:移动组件 SpaceComponent: 场景组件 CombatComponent...
我在网络框架这一篇中介绍如何使用7-bits编码方法解决tcp的粘包问题,不仅仅是tcp的字节流,我们内部自己的消息也存在这样的问题。我将在本节具体介绍我们如何继续使用7-bits编码方法将设计的消息结构体编码成一个可解析的字节流。 假设现在有这样一个消息,负责回复客户端的加入请求。我们称之为join_reply消息。所有proto消息都由两部分构成,消息名和消息体。消息名用于标识消息的类...