📄️ 开发环境搭建
安装IDE
📄️ Node(节点)
moon进程称为Node, 每个Node通过组合不同功能的服务来组成特定类型的进程(游戏逻辑服, 跨服战场),不同的Node组成游戏服务器集群(Cluster)。使用以下命令就创建一个Node:
📄️ 服务
服务作为Actor的载体,是线程调度的最小单元。暂时只有Lua类型的服务, Lua Service用一个LuaVM表示,它们可以独占或者共享线程。不同Lua Service之间不能直接访问,它们只能通过消息通信来交互。服务主要分为唯一服务和普通服务。moon中创建服务的API是moon.newservice(serviceconf)。
📄️ 消息
服务内部采用消息通信,通常是传递一个message指针,这样比进程间通信效率高得多,底层消息结构:
📄️ 服务调度
Lua协程
📄️ 节点间通信
设置启动选项
📄️ Socket
moon框架是多线程的,每个线程都有一个asio::io_context, 所以运行在worker线程中的所有服务都有网络通信的能力。框架为lua提供了基础的Socket API,为了方便游戏开发,封装了常用协议的(如websocket),同时也支持编写自定义协议。
📄️ Http
现在游戏开发经常需要对接一些SDK,它们大多使用Http协议交互, Moon提供了简单的支持。
📄️ HoftFix
lua作为脚本语言,一个优势就是可以做热更新,在不重启进程的情况下,用新版本的函数替换旧版本函数。但由于lua的灵活性,实现100%的热更又不太可能。可以参考 https://blog.codingnow.com/2016/11/lua_update.html, 但云风的方案是尽量实现正确的热更,遍历了几乎整个VM,导致处理速度较慢,对于一个玩家一个luaVM的情况下,上千个luaVM可能导致卡顿几分钟。
📄️ Moon中的Lua Json Lib
Lua的json库主要是对table进行encode和decode, 先列举以下lua和json的差异
📄️ 工具
Lua table schema validate