GeekServer

GeekServer

开源跨平台游戏服务器框架 支持热更新与异步编程

GeekServer是一个基于C# .NET Core的开源游戏服务器框架,支持分区分服架构。它提供跨平台兼容、全面异步编程和Actor模型,并支持不停服热更新。该框架性能出色,开发效率高,尤其适合Unity3D项目。GeekServer集成了网络通信、数据持久化和定时器等游戏服务器常用功能,并提供高效的通信协议和便捷的数据导出工具,显著简化了游戏服务器的开发过程。

GeekServer游戏服务器框架Actor模型热更新异步编程Github开源项目

GeekServer 介绍:

GeekServer 是一个开源的分区分服的游戏服务器框架,采用 C# .Netcore 开发,开发效率高,性能强,跨平台,并内置不停服热更新机制。可以满足绝大部分游戏类型的需求,特别是和 Unity3D 协同开发更佳。
设计理念:大道至简,以简化繁

GeekServer 功能:

1.跨平台

使用 C# .Netcore 开发(可以跨平台,可以跨平台,可以跨平台),.Netcore 现在功能和性能都已经十分强大和稳健,不管是在 windows 还是 linux 上部署起来都很简便。

2.全面异步编程

全部采用异步编程(async/await),让逻辑代码变得整洁优雅,清晰易懂,让代码写起来行如流水。

3.TPL(Task Parallel Library) Actor 模型

GeekServer 的 Actor 模型构建于强大的 TPL DataFlow 之上,让 Actor 模型如虎添翼。(不了解 Actor 模型,可以搜一下相关资料,Akka,Orleans 都是采用的 Actor 模型)了解更多

4.Actor 入队透明化

GeekServer 内部会自动处理线程上下文, 编译期间会通过Source Generator自动生成入队代码, 开发人员无需关心多线程以及入队逻辑, 只需要像调用普通函数一样书写逻辑。了解更多

5.Actor 死锁检测

Actor 模型本身是存在死锁的情况,且不容易被发现。GeekServer 内部可检测环路死锁(即:A->B->C->A),并采用调用链重入机制消除环路死锁。了解更多

6.支持不停服更新

采用组件+状态的设计,状态只有属性,没有方法,组件只用方法,没有属性,并通过代理的方式全部放到热更 dll 中,运行时重新加载 dll 即可热更所有逻辑。了解更多

7.网络模块

网络模块替换了原来的 DotNetty,采用 Asp.Net 的默认服务器 Kestrel,支持协议多(Tcp,udp,Http123,websocket,signalr 等),而且性能比 dotnetty 高很多了解更多

8.持久化透明

采用 Nosql 作为数据存储,状态的持久化全透明,框架会自动序列化/反序列,让开发人员更加专注于业务逻辑,无需操心数据库。 了解更多

9.Timer/Scheduler/Event

内置线程安全的 Timer,Scheduler,Event 系统,轻松应对游戏服务器常见的定时,任务计划,事件触发等业务需求。了解更多

10.定期释放不活跃内存数据

以功能系统级别的粒度,定期剔除内存中不活跃的玩家数据,尽最大可能减少服务器内存开销。

11.高效的通信协议(基于 MessagePack)

Geek.MsgPackTool [MessagePack]对多态支持不够友好,GeekServer 提供了工具来生成多态注册信息,序列化和反序列化效率极高,同时序列化之后的数据极小,数据传输效率很高。了解更多

12.一键导表工具(GeekConfig)

GeekConfig是一个一键导表工具,将策划配置表,转化为二进制数据,并提供了方便快捷的 API 供游戏调用

运行

  1. 安装.Net 7.x
  2. 安装mongodb
  3. 打开 git clone 本项目https://github.com/leeveel/GeekServer.git
  4. 运行 Tools/ExcelGen/ExcelToCode.exe 点击[服务器-ALL]导出配置表
  5. 用 VisualStudio2022 打开 GeekServer.sln 启动 GeekServer.App
  6. 启动 GeekServer.Test (一个 1000 人登录的 demo)
  7. 打开 UnityDemo 工程,打开 SampleScene,运行查看日志(检查 Main Camera 上是否有脚本丢失,如果有请挂载 GameMain.cs)

文档&例子&Demo

十分钟上手教程
了解更多

群友分享:
快速了解 GeekServer(Space_Dark 写)

代码片段

//采用注解注册Actor组件 [Comp(ActorType.Role)] public class BagComp : StateComp<BagState>{} //调用Actor组件函数(就像调用普通函数一样,无需关心多线程或入队) var serverComp = await EntityMgr.GetCompAgent<ServerCompAgent>(ActorType.Server); await serverComp.CheckCrossDay(); //定义状态(数据) public class RoleState : DBState { public string RoleName { get; set; } public long RoleId { get; set; } ... } //绑定组件 public class RoleComp : StateComponent<RoleState>{} //绑定组件Agent(Agent类逻辑可全部热更新) public class RoleCompAgent : StateComponentAgent<RoleComp, RoleState>{}

最佳实践

GeekServer 有严格的书写规范检查,如不符合规范编译直接报错
1.CompAgent 不能被二次继承,Agent 继承的需求理论上很少,如果有请采用组合模式
2.为 CompAgent 中需要被外部提供服务的接口,添加【Service】注解
3.CompAgent 中非【Threadsafe】的【Service】接口只能是异步函数
4.CompAgent 中不要书写构造函数,重写 Active 函数来完成初始化工作
5.大部分情况下你都应该使用 await 等待来书写逻辑,不需要等待的方法请加上【Discard】注解,如:通知全服玩家,就没必要等待一个通知完成后再通知下一个。 同时Source Generator在编译期间对标记了【Discard】的函数做了处理,内部直接返回了 Task.CompletedTask,所以外部使用下划线丢弃或是用 await 都是等价的,为了规范统一,可以全部使用 await。这样有个好处,就是可以在编译期间检查所有 Agent 中的代码,如有发现使用了弃元运算符(_ = DoSomething())则提示代码编写不符合规范。

public Task NotifyAllClient() { for(int i=0; i<clients.count; i++) { //_ = NotifyOneClient(clients[i].roleId); //对于标记了[Discard]的函数,等价于上面一行代码 await NotifyOneClient(clients[i].roleId); } } [Service] [Discard] public virtual Task NotifyOneClient(long roleId) { //... //... }

5.CompAgent 中为需要提供给外部访问接口,标记注解,如果不加外部又有访问,则会有线程安全问题,除非此接口本身就是线程安全的(标记了[ThreadSafe]注解)。

public class ServerCompAgent : StateCompAgent<ServerComp, ServerState> { private Task TestScheduleTimer() { LOGGER.Debug("ServerCompAgent.TestSchedueTimer.延时1秒执行.每隔3秒执行"); return Task.CompletedTask; } /// <summary> /// 由于此接口会提供给其他Actor访问,所以需要标记为[Service] /// </summary> /// <returns></returns> [Service] public virtual Task<int> GetWorldLevel() { return Task.FromResult(State.WorldLevel); } }

更多异步书写规范请参考微软官方文档AsyncGuidance.md

推荐项目

GeekConfig 一键从 Excel 中导出模板代码和二进制数据

编辑推荐精选

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

下拉加载更多