
从零开始学Skynet
文章平均质量分 82
记录skynet服务器框架的学习和开发,让大家少走一些弯路。
寻水的鱼、、
博主擅长游戏开发,有十几年的游戏开发经验和从业经验。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【从零开始学Skynet】高级篇(一):Protobuf数据传输
Protobuf是谷歌发布的一套协议格式,它规定了一系列的编码和解 码方法,比如对于数字,它要求根据数字的大小选择存储空间,小于等于15的数字只用1个字节来表示,大于15的数用2个字节表示,以此类推,这样要求可以尽可能地节省空间。Protobuf协议的一大特点是编码后的数据量很小,可以节省网络带宽。上图展示了用pbc模块处理Protobuf协议的流程。我们需要先编写描述文件,描述文件有它特定的格式,再用名为protoc的软件将它转换成.pb格式的文件;最后使用pbc库提供的方法实现编码解码。原创 2023-05-13 00:15:45 · 2219 阅读 · 3 评论 -
【从零开始学Skynet】实战篇《球球大作战》(十五):项目问题和改进
服务端只需做校验,这样就把计算量转移到了客户端(后面会介绍不同做法的优劣之处)。稳定运行的前提是所有Skynet节点都能稳定运行, 且各个节点能维持稳定的网络通信,因此所有节点应当部署在同一局域网。匹配时应尽量匹配到同节点的场景服务,只有在某些特殊玩法中才匹配到跨节点的场景服务。之间,玩家充值了,因为已经保存了数据,所以更新的金额不会被再次保存)。之间偶尔发送心跳协议,若检测到客户端连接已断开,则请求下线。状态,下线请求不会被执行,除非再次登录踢下线,否则agent。消息,分别用于保存数据和退出服务。原创 2023-04-18 17:51:20 · 1192 阅读 · 2 评论 -
【从零开始学Skynet】实战篇《球球大作战》(十四):agent跨服务器版
至此,我们已完成了《球球大作战》的绝大部分功能,只剩下完 善agent,让它和scene服务联动了。1、多个模块一般而言,代理服务会承载很多系统,比如邮件、成就等,此处涉及的代码较多,容易混乱,需划分模块。之前实现的service模块能让服务带有分模块的潜力。新建用于处理agent的战斗逻辑,只需在init.lua中引入(require)新增的文件,即可使用新文件提供的功能,如果后续开发邮件、成就等系统,同样要新建一个文件,每个文件处理一项功能。原创 2023-04-18 09:42:33 · 1025 阅读 · 0 评论 -
【从零开始学Skynet】实战篇《球球大作战》(十三):场景代码设计(下)
它会遍历所有的球和食物,并根据两点间距离公式(见下图)判断小球是否和食物发生了碰撞。如果发生碰撞,即视为吞下食物,服务端会广播eat。《球球大作战》是一款服务端运算的游戏,一般会使用主循环程序结构,让服务端处理战斗逻辑。本篇的场景服务代码更多的是为了演示如何使用框架, 没有很多性能考究。要加快执行,只能给很短的间隔时间。秒)执行一次循环,在循环中会处理食物生成、位置更新等功能。开启一个协程,协程的代码位于匿名函数中。0.2减去执行时间,如下左图所示,图中。,因此它只需遍历场景中的所有球,根据。原创 2023-04-17 17:53:52 · 1020 阅读 · 0 评论 -
【从零开始学Skynet】实战篇《球球大作战》(十二):场景代码设计(上)
场景服务会处理绝大部分的游戏逻辑。新建,开始编写相关代码。原创 2023-04-17 16:13:57 · 1480 阅读 · 0 评论 -
【从零开始学Skynet】实战篇《球球大作战》(十一):战斗场景设计
现在的服务端框架有支撑数万玩家的能力,且支持横向拓展(即 增加物理机数量),理论上具有无上限的负载能力。下面以《球球大 作战》为例,说明怎样使用这套框架。1、战斗流程玩家登录后,玩家可以做些非战斗操作(仿照work示例,可以实现 成就、背包、邮件、好友等功能),如下图所示:当点击开始比赛按钮时,客户端会发生“进入战斗的协议。战斗流程如下图所示:服务端会开启很多服务,每个服务处理一场战斗。收到进入战斗的协议后,agent会随机选择一个战斗服务。进入战斗后,会与某个scene服关联。原创 2023-04-17 14:20:43 · 1069 阅读 · 0 评论 -
【从零开始学Skynet】实战篇《球球大作战》(十一):测试登录流程
终于可以测试work协议了。只要走得通,就代表完成了整套底层框架。原创 2023-04-17 10:41:40 · 906 阅读 · 0 评论 -
【从零开始学Skynet】实战篇《球球大作战》(十):agent代码设计
现在开发登录流程涉及的最后一个服务,完成后就可以真正地把框架运行起来了。还会演示agent的单机功能,做个“打工”小游戏。原创 2023-04-16 23:38:14 · 1065 阅读 · 0 评论 -
【从零开始学Skynet】实战篇《球球大作战》(九):agentmgr和nodemgr代码设计
是管理的服务,它是登录过程的仲裁服务,控制着登录流程。中含有一个列表,里面保存着所有玩家的在线状态。首先,在目录下新建,然后开始编写它。原创 2023-04-16 21:50:53 · 597 阅读 · 0 评论 -
【从零开始学Skynet】实战篇《球球大作战》(八):login代码设计
现在来编写我们的第二个服务——登录服务,在编写此服务时,建议大家对照着如下所示的来看,知晓各个方法的作用,写起来会简单许多。原创 2023-04-16 14:26:32 · 798 阅读 · 0 评论 -
【从零开始学Skynet】实战篇《球球大作战》(七):gateway代码设计(下)
代码写到这里,我们的gateway网关这一块的功能差不多就基本写完了。写完之后,我们可以进行一个简单的测试,用telnet客户端测试gateway能否正常工作。玩家有两种登出的情况,一种是客户端掉线,另一种是被顶替下线。若是客户端掉线,会调用如下所示的。输入消息,由于在telnet换行即为输入分隔符。想直接把玩家踢下线,在保存数据后,它会通知。在完成了登录流程后,关联起来,它会先查找连接对象。按照下图所示的登出流程,原创 2023-04-16 12:40:17 · 747 阅读 · 1 评论 -
【从零开始学Skynet】实战篇《球球大作战》(六):gateway代码设计(中)
传入的msgstr为“login, 101, 134”,则匹配后arg的值为“login”、rest的值“101,134”;传入的msgstr为“101, 134”,则匹配后arg的值为“101”、rest的值为“134”。方法的示意图,gateway收到客户端协议后,如果玩家已登录,它会将消息转发给对应的代理(阶段③);为真的部分,程序将随机选取同节点的一个登录服务器转发消息,相关变量的含义如下。是自定义的消息名(skynet中的概念,指服务间传递的消息名字,它与。的消息转发,功能是将消息发送给指定。原创 2023-04-16 11:21:10 · 1451 阅读 · 1 评论 -
【从零开始学Skynet】实战篇《球球大作战》(五):gateway代码设计(上)
TCP协议是一种基于数据流的协议,举例来说,如果客户端分两次发送“1234”和“5678”这两条消息。在写代码之前,我们要先了解什么是协议,协议就是 “客户端向服务端发起的登录请求”,那么登录请求是什么样子的呢?可能包含多条消息,且process_buff主体是个循环结构,因此每次循环时都会使用string.match匹配一条消息,再调用下一阶段的process_msg(稍后实现)处理它。通过拼接Lua字符串实现缓冲区是一种简单的做法,它可能带来GC(垃圾回收)的负担,后面我们会介绍更高效的方法。原创 2023-04-15 21:40:31 · 1581 阅读 · 0 评论 -
【从零开始学Skynet】实战篇《球球大作战》(四):分布式登录系统
登录登出过程涉及的步骤较多,越多就越复杂,也就越容易出错。假设客户端B已在线的情形,但如果在客户端B登录的过程中(比如角色数据尚未全部加载),客户端A请求登录,又该如何处理?会不会造成数据紊乱?这些情况颇为复杂,我们的解决办法是。所有上线下线的请求都要经过agentmgr,由它裁决,只有“已在线”状态的客户端方可被顶替下线,如果处于“登录中”或“登出中”agentmgr会告诉新登录的客户端其他玩家正在尝试登录该账号,请稍后再试。原创 2023-04-15 12:00:24 · 1280 阅读 · 0 评论 -
【从零开始学Skynet】实战篇《球球大作战》(三):封装常用的API
新建文件--类型和idname = "",id = 0,--回调函数--分发方法resp = {},return Mname代表服务的类型id代表服务编号。如下图中的gateway1,它的name是gatewayid是1;对于agentmgr,它的name是agentmgrid是0(全局唯一)。init和exit是回调方法,在服务初始化和退出时会被调用(本篇暂不实现exit的功能)。resp表会存放着消息处理方法。原创 2023-04-15 00:05:43 · 1347 阅读 · 1 评论 -
【从零开始学Skynet】实战篇《球球大作战》(二):结构设计
万丈高楼平地起,既然这是个“大项目”,就要有大项目的样子,就要有所规划,下面先把项目的目录结构搭起来。原创 2023-04-14 21:31:22 · 2547 阅读 · 0 评论 -
【从零开始学Skynet】实战篇《球球大作战》(一):功能设计
为了能把之前在基础篇中学习到的Skynet的各种知识结合起来,所以在实战篇中,我们准备开发一个完整的游戏案例《球球大作战》,介绍分布式游戏服务端的实现方法。原创 2023-04-13 22:18:56 · 2549 阅读 · 0 评论 -
【从零开始学Skynet】基础篇(八):简易留言板
这一篇我们要把网络编程和数据库操作结合起来,实现一个简单的留言板功能。1、功能需求如下图所示,客户端发送“set XXX”命令时,程序会把留 言“XXX”存入数据库,发送“get”命令时,程序会把整个留言板返回给客户端。原创 2023-04-13 16:48:50 · 846 阅读 · 0 评论 -
【从零开始学Skynet】基础篇(七):Mysql数据库常用API
在上一篇中我们完成了对Mysql数据库的准备工作之后,这一篇我们写一个程序测试一下。原创 2023-04-13 15:59:29 · 1193 阅读 · 0 评论 -
【从零开始学Skynet】基础篇(六):MySql数据库安装操作
游戏服务端的另一项重要功能是保存玩家数据,Skynet提供了操作MySQL数据库、MongoDB数据库的模块。原创 2023-04-13 13:22:29 · 1177 阅读 · 0 评论 -
【从零开始学Skynet】工具篇(二):虚拟机文件的复制粘贴
大家在Linux系统下开发的时候肯定会遇到虚拟机与主机间无法复制粘贴的问题,现在我们就来解决这样的问题,方便我们的开发。原创 2023-04-13 10:23:11 · 6257 阅读 · 1 评论 -
【从零开始学Skynet】基础篇(五):简易聊天室
在游戏中各玩家之间都可以进行聊天之类的交互,在这一篇中,我们就来实现一个简易的聊天室功能,这在上一篇代码的基础上很容易就能实现。原创 2023-04-12 16:54:18 · 2010 阅读 · 0 评论 -
【从零开始学Skynet】基础篇(四):网络模块常用API
游戏服务端要处理客户端请求,作为服务端引擎,网络编程也是Skynet的核心功能。1、学习网络模块模块提供了网络编程的socket.read中所谓的阻塞模式和 skynet.call一样,都利用了Lua的协程机制。调用,服务有可 能被挂起,直到接收到数据,才会往下执行。更多API参见:2、功能开发学完上面的API,我们来写一个Echo程序,Echo程序其实就是一个开启处理客户端消息的服务,它会把收到的内容原封不动地发回给客户端。原创 2023-04-12 11:58:04 · 3089 阅读 · 1 评论 -
【从零开始学Skynet】基础篇(三):服务模块常用API
Skynet支持多种消息类型,由于Lua服务间的消息类型是“lua”,因此这里暂时将它定为“lua”。func是指收到消息后的处理函数,当一个服务收到消息时,skynet就会开启新协程,并调用它。发送方用skynet.send发送消息,接收方用skynet.dispatch接受消息,它们的参数相互对应。source代表消息来源,指发送消息的服务地址,cmd代表消息名,“...”是一个可变参数,内容由发送方的skynet.send或skynet.call指定。最后打开终端,输入如下指令,显示运行结果。原创 2023-04-12 10:28:26 · 3028 阅读 · 2 评论 -
【从零开始学Skynet】基础篇(二):了解Skynet
skynet 在启动时,会读取里面必要的配置项,并将暂时用不到的配置项以字符串形式保存在 skynet 内部的 env 表中。在下图所示的服务端系统中,每个Skynet进程(操作系统进程)都称为一个节点,每个节点都可以开启数千个Lua服务,每个服务都是一个Actor。不同节点可以部署在不同的物理机上,提供分布式集群的能力。拓展:其实Skynet的强项主要是在于单个节点内的并行运算,对于分布式集群,它只提供一些基础设施。下图展示了Skynet的启动流程。在上图中,我们开启了3个节点和5个服务的服务端系统。原创 2023-04-11 23:10:36 · 4472 阅读 · 0 评论 -
【从零开始学Skynet】工具篇(一):Ubuntu16.04环境搭建
点击这里进行下载,下载完之后点击客户端进行安装,安装很简单,一直点击下一步就可以了。原创 2023-04-10 00:02:48 · 1115 阅读 · 0 评论 -
【从零开始学Skynet】基础篇(一):Skynet环境搭建
Skynet运行于Linux操作系统,我们可以在自己的电脑上搭建虚拟机系统,也可以购买阿里云、腾讯云服务器,笔者这个系列的所有代码都是在Ubuntu16.04版本的虚拟机系统下运行编辑。原创 2023-04-11 20:57:27 · 2653 阅读 · 0 评论