游戏开发论坛

 找回密码
 立即注册
搜索
查看: 92|回复: 0

NiuMa游戏平台,开源游戏解决方案

[复制链接]

1

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2025-3-5 15:55:04 | 显示全部楼层 |阅读模式
NiuMa游戏平台是一套包含游戏服务器、游戏管理后台以及客户端的完整游戏框架解决方案,该框架支持跨平台和分布式部署,其中游戏服务器基于C++开发,具备极高性能以及并发性;游戏管理后台基于若依框架(SpringBoot+VUE)开发;客户端基于Unity3D引擎开发,热更新方案采用腾讯开源的xLua框架。后端使用MySql数据库,依赖的中间件包括Redis、RabbitMQ以及Nginx,底层依赖都是行业内最流行的库、组件和框架,而且都是开源免费使用的。
平台代码仓库地址:源码地址
游戏服务器的核心模块包括:网络IO、线程模型、消息分发及处理,这三个核心模块从根本上影响着服务器整体并发性能。本项目网络IO模块使用的是boost::asio框架,如下图所示,一个TCP会话(Session)代表着一个客户端与服务器的TCP网络连接,这里将一个完整的游戏逻辑单元定义为一个游戏场地(Venue),例如一张棋桌就是一个游戏场地,每个游戏场地有全局唯一ID,初始化时创建一个专门处理场地内部逻辑的线程池,线程池中每个线程包含设定数量的消息处理器(Message Handler),系统中所有消息处理器都会注册到一个单例的消息处理器列表中,当新建一个游戏场地时,该场地会根据负载情况分配到当前负载最轻的消息处理器,因此一个消息处理器维护了一个场地列表,由此一个场地的所有游戏逻辑和消息处理都在同一个线程内执行,这避免了多线程的数据同步问题,以及复杂容易出错的异步调用问题。当TCP会话收到一个消息时,网络接收线程遍历消息处理器列表,一旦列表中有一个消息处理器接收该消息即结束遍历,因为所有场地内的消息都携带了场地ID字段,可以用于哈希表匹配,所以遍历是一个非常快速的一个过程。

系统包含两种不同处理方式的业务逻辑,一种为上述的游戏功能业务逻辑,由C++游戏服务器进行处理;另一种则是登录及游戏主界面(游戏大厅)的业务逻辑,由WEB服务器进行处理,通过HTTP Restful接口进行通信,同时WEB服务器还负责根据游戏服务实例的负载情况进行游戏场地分配,例如当玩家新建一个斗地主游戏房间时,会把创建请求发送到WEB服务器,WEB根据所有游戏服务实例的负载情况,将新建的房间分配到当前负债最轻的游戏服务实例,并向客户端返回该游戏服务实例的连接信息(IP、端口),客户端再与该游戏服务实例建立TCP连接,从而完成进入该游戏房间,并开始游戏业务逻辑。
系统后端采用分布式架构设计,由WEB服务基于全局Redis的数据记录进行负载决策,游戏服务实例实时更新本节点当前的负载情况到全局Redis数据库中,每个WEB服务实例都可以独自进行负载决策,因此系统中不需要统一控制的中心和路由服务器实例,并使得游戏服务和WEB服务可以根据实际业务量进行灵活节点部署,同时也不需要担心单节点性能瓶颈问题。WEB服务实例与游戏服务实例之间通过RabbitMQ进行交互通信,服务器之间的查询调度可以简单、有序且高效地进行。

客户端AssetBundle打包,打包出来的文件如下图所示,其中MainManifest.xml文件为客户端主界面依赖的AssetBundle包清单,GameManifest.xml文件为客户端中各游戏依赖的AssetBundle包清单,Dependencies.xml文件为AssetBundle包之间的依赖关系,Dependencies.xml文件在打资源包时自动生成和更新(打LUA脚本包不会更新该文件),其他两个xml则需要手动编辑。客户端主界面以及各个游戏的依赖AssetBundle包可以单独更新,这样使得在更新客户端时可以最小化下载依赖文件。客户端支持调试模式,以便在打包之后(例如安卓和IOS端)可以在屏幕上打印Debug.Log(以及Lua的print函数)的输出内容,方便在手机上排查错误。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-4-4 19:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表