GameFrameX.DBServer
1.0.4
See the version list below for details.
dotnet add package GameFrameX.DBServer --version 1.0.4
NuGet\Install-Package GameFrameX.DBServer -Version 1.0.4
<PackageReference Include="GameFrameX.DBServer" Version="1.0.4" />
paket add GameFrameX.DBServer --version 1.0.4
#r "nuget: GameFrameX.DBServer, 1.0.4"
// Install GameFrameX.DBServer as a Cake Addin #addin nuget:?package=GameFrameX.DBServer&version=1.0.4 // Install GameFrameX.DBServer as a Cake Tool #tool nuget:?package=GameFrameX.DBServer&version=1.0.4
GeekServer介绍:
GeekServer是一个开源的分区分服
的游戏服务器框架,采用C# .Netcore开发,开发效率高,性能强,跨平台,并内置不停服热更新机制。可以满足绝大部分游戏类型的需求,特别是和Unity3D协同开发更佳。
设计理念:大道至简,以简化繁
程序集说明
程序集名称 | 介绍 | 用途 |
---|---|---|
Server.Luncher | 程序启动入口 | 用于编写启动逻辑 |
Server.Hotfix | 热更新逻辑和处理程序对象放置区(该部分为热更新内容) | 用于编写逻辑的地方(主要工作区 ,目录和Apps 目录结构一致) |
Server.Apps | 组件和实体对象放置区(该部分不能热更新) | 用于编写基础逻辑和数据存储(功能的添加修改主要工作区 ,目录结构按照ServerType 划分和HotFix 对应) |
Server.Config | 配置文件对象和配置文件放置区 | 用于编写配置文件的类和文件的映射(目前由LuBan自动生成) |
Server.Core | 核心底层逻辑 | 用于编写核心库 |
Server.DBServer | 数据库操作相关服务 | 用于编写数据库操作相关的逻辑 |
Server.Extension | 对框架的扩展 | 用于编写函数或其他工具库的扩展 |
Server.Google.ProtoBuf | ProtoBuff协议支持库 | ProtoBuff协议库(一般不会更新和修改) |
Server.Log | 日志配置和操作放置区 | 用于编写日志配置相关 |
Server.Proto | 数据通讯协议对象放置区 | 用于编写通讯协议对象 |
Server.Serialize | 序列化器 对象放置区 | 用于编写通讯协议的序列化和反序列化的帮助类 |
Server.Setting | 设置相关的内容 放置区域 | 用于编写游戏逻辑配置或常量配置 |
Server.Utility | 工具函数 对象放置区 | 用于编写一些工具相关的函数 |
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供游戏调用
13.数据库客户端(GeekDB.GUI)
GeekDB.GUI是一个数据库客户端,GeekServer支持内嵌(RocksDB) 和直连MongoDB的模式,但是存放的数据都是通过MessagePack序列化之后的二进制,此工具用于对这些二进制数据进行浏览。了解更多
运行
- 安装.NetCore6.0
- 安装mongodb4.x
- 打开git clone本项目https://github.com/leeveel/GeekServer.git
- 运行Tools/ExcelGen/ExcelToCode.exe 点击[服务器-ALL]导出配置表
- 用VisualStudio2022打开GeekServer.sln 启动GeekServer.App
- 启动GeekServer.Test (一个1000人登录的demo)
- 打开UnityDemo工程,打开SampleScene,运行查看日志(检查Main Camera上是否有脚本丢失,如果有请挂载GameMain.cs)
文档&例子&Demo
代码片段
//采用注解注册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中需要被外部提供服务的接口,添加【Api】注解
3.CompAgent中非【Threadsafe】的【Api】接口只能是异步函数
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);
}
}
[Api]
[Discard]
public virtual Task NotifyOneClient(long roleId)
{
//...
//...
}
5.CompAgent中为需要提供给外部访问接口,标记[Api]注解,如果不加外部又有访问,则会有线程安全问题,除非此接口本身就是线程安全的(标记了[ThreadSafe]注解)。
public class ServerCompAgent : StateCompAgent<ServerComp, ServerState>
{
private Task TestScheduleTimer()
{
LOGGER.Debug("ServerCompAgent.TestSchedueTimer.延时1秒执行.每隔3秒执行");
return Task.CompletedTask;
}
/// <summary>
/// 由于此接口会提供给其他Actor访问,所以需要标记为[Api]
/// </summary>[GameFrameX.Client.csproj](GameFrameX.Client%2FGameFrameX.Client.csproj)
/// <returns></returns>
[Api]
public virtual Task<int> GetWorldLevel()
{
return Task.FromResult(State.WorldLevel);
}
}
更多异步书写规范请参考微软官方文档AsyncGuidance.md
推荐项目
GeekConfig 一键从Excel中导出模板代码和二进制数据
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net8.0
- GameFrameX.ProtoBuf.Net (>= 1.0.4)
- GameFrameX.Setting (>= 1.0.4)
- GameFrameX.Utility (>= 1.0.4)
- MongoDB.Bson (>= 2.24.0)
- MongoDB.Driver (>= 2.24.0)
- MongoDB.Driver.Core (>= 2.24.0)
- Newtonsoft.Json (>= 13.0.3)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on GameFrameX.DBServer:
Package | Downloads |
---|---|
GameFrameX.DBServer.Mongo
GameFrameX.DBServer.Mongo |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.0.7-beta10 | 127 | 7/16/2024 |
1.0.6-beta7 | 107 | 7/16/2024 |
1.0.6-beta5 | 98 | 7/12/2024 |
1.0.6-beta4 | 96 | 7/11/2024 |
1.0.6-beta3 | 113 | 7/9/2024 |
1.0.6-beta2 | 87 | 7/9/2024 |
1.0.6-beta1 | 114 | 7/9/2024 |
1.0.6-bata6 | 111 | 7/15/2024 |
1.0.5 | 144 | 7/5/2024 |
1.0.5-beta2 | 119 | 7/6/2024 |
1.0.5-beta1 | 111 | 7/6/2024 |
1.0.5-beta | 120 | 7/6/2024 |
1.0.4 | 133 | 7/4/2024 |
1.0.3 | 116 | 7/4/2024 |
1.0.0 | 127 | 7/3/2024 |
0.0.7-beta | 131 | 7/4/2024 |