GameFrameX.NetWork.Message 1.2.0-beta1

This is a prerelease version of GameFrameX.NetWork.Message.
There is a newer version of this package available.
See the version list below for details.
dotnet add package GameFrameX.NetWork.Message --version 1.2.0-beta1
                    
NuGet\Install-Package GameFrameX.NetWork.Message -Version 1.2.0-beta1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="GameFrameX.NetWork.Message" Version="1.2.0-beta1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="GameFrameX.NetWork.Message" Version="1.2.0-beta1" />
                    
Directory.Packages.props
<PackageReference Include="GameFrameX.NetWork.Message" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add GameFrameX.NetWork.Message --version 1.2.0-beta1
                    
#r "nuget: GameFrameX.NetWork.Message, 1.2.0-beta1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package GameFrameX.NetWork.Message@1.2.0-beta1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=GameFrameX.NetWork.Message&version=1.2.0-beta1&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=GameFrameX.NetWork.Message&version=1.2.0-beta1&prerelease
                    
Install as a Cake Tool

GameFrameX介绍:

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

程序集说明

程序集名称 介绍 用途
GameFrameX.Launcher 程序启动入口 用于编写启动逻辑
GameFrameX.Hotfix 热更新逻辑和处理程序对象放置区(该部分为热更新内容) 用于编写逻辑的地方(主要工作区,目录和Apps目录结构一致)
GameFrameX.Apps 组件和实体对象放置区(该部分不能热更新) 用于编写基础逻辑和数据存储(功能的添加修改主要工作区,目录结构按照ServerType 划分和HotFix对应)
GameFrameX.Config 配置文件对象和配置文件放置区 用于编写配置文件的类和文件的映射(目前由LuBan自动生成)
GameFrameX.Core 核心底层逻辑 用于编写核心库
GameFrameX.DBServer 数据库操作相关服务 用于编写数据库操作相关的逻辑
GameFrameX.Extension 对框架的扩展 用于编写函数或其他工具库的扩展
GameFrameX.Google.ProtoBuf ProtoBuff协议支持库 ProtoBuff协议库(一般不会更新和修改)
GameFrameX.Log 日志配置和操作放置区 用于编写日志配置相关
GameFrameX.Proto 数据通讯协议对象放置区 用于编写通讯协议对象
GameFrameX.Serialize 序列化器 对象放置区 用于编写通讯协议的序列化和反序列化的帮助类
GameFrameX.Setting 设置相关的内容 放置区域 用于编写游戏逻辑配置或常量配置
GameFrameX.Utility 工具函数 对象放置区 用于编写一些工具相关的函数

GameFrameX功能:

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.定期释放不活跃内存数据

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

运行

  1. 安装.NetCore8.0
  2. 安装mongodb4.x
  3. 打开git clone本项目
  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

十分钟上手教程
了解更多

代码片段

//采用注解注册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

Product 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.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on GameFrameX.NetWork.Message:

Package Downloads
GameFrameX.StartUp

GameFrameX.Setting,GameFrameX 框架的基础设施框架库.框架文档主页: https://gameframex.doc.alianblank.com

GameFrameX.NetWork.ChannelBase

GameFrameX.NetWork.ChannelBase

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.0.0.2-dev1 99 3 days ago
2.0.0.1-dev9 80 9 days ago
2.0.0.1-dev8 151 14 days ago
2.0.0.1-dev7 431 20 days ago
2.0.0.1-dev6 158 21 days ago
2.0.0.1-dev4 115 24 days ago
2.0.0.1-dev3 125 24 days ago
2.0.0.1-dev2 145 24 days ago
2.0.0.1-dev1 168 a month ago
2.0.0-dev4 164 a month ago
2.0.0-dev3 164 a month ago
2.0.0-dev2 165 a month ago
2.0.0-dev1 150 a month ago
1.5.1-dev9 298 7 months ago
1.5.1-dev7 159 7 months ago
1.5.1-dev6 156 7 months ago
1.5.1-dev5 179 7 months ago
1.5.1-dev47 228 a month ago
1.5.1-dev46 291 2 months ago
1.5.1-dev45 291 2 months ago
1.5.1-dev44 1,011 3 months ago
1.5.1-dev43 888 4 months ago
1.5.1-dev42 277 4 months ago
1.5.1-dev41 175 4 months ago
1.5.1-dev40 178 4 months ago
1.5.1-dev4 549 7 months ago
1.5.1-dev39 99 4 months ago
1.5.1-dev38 181 5 months ago
1.5.1-dev37 170 5 months ago
1.5.1-dev36 168 5 months ago
1.5.1-dev35 378 5 months ago
1.5.1-dev34 412 5 months ago
1.5.1-dev33 148 5 months ago
1.5.1-dev32 160 5 months ago
1.5.1-dev31 157 5 months ago
1.5.1-dev30 206 5 months ago
1.5.1-dev3 466 7 months ago
1.5.1-dev29 193 5 months ago
1.5.1-dev28 320 6 months ago
1.5.1-dev27 270 6 months ago
1.5.1-dev26 264 6 months ago
1.5.1-dev25 303 6 months ago
1.5.1-dev24 290 6 months ago
1.5.1-dev23 248 6 months ago
1.5.1-dev22 94 6 months ago
1.5.1-dev21 118 6 months ago
1.5.1-dev20 135 6 months ago
1.5.1-dev2 214 7 months ago
1.5.1-dev19 133 6 months ago
1.5.1-dev17 155 6 months ago
1.5.1-dev16 212 6 months ago
1.5.1-dev15 175 6 months ago
1.5.1-dev14 177 6 months ago
1.5.1-dev13 165 6 months ago
1.5.1-dev10 197 7 months ago
1.5.1-dev1 190 8 months ago
1.5.0-dev1 318 8 months ago
1.4.2 202 9 months ago
1.4.2-dev9 164 8 months ago
1.4.2-dev8 173 9 months ago
1.4.2-dev7 209 9 months ago
1.4.2-dev6 146 9 months ago
1.4.2-dev5 154 9 months ago
1.4.2-dev4 157 9 months ago
1.4.2-dev3 154 9 months ago
1.4.2-dev2 165 9 months ago
1.4.2-dev15 342 8 months ago
1.4.2-dev14 276 8 months ago
1.4.2-dev13 154 8 months ago
1.4.2-dev12 133 8 months ago
1.4.2-dev11 150 8 months ago
1.4.2-dev10 130 8 months ago
1.4.2-dev1 140 9 months ago
1.4.1 162 9 months ago
1.4.0 160 9 months ago
1.3.3 148 9 months ago
1.3.2 150 9 months ago
1.3.1 165 9 months ago
1.3.0-beta2 147 9 months ago
1.3.0-beta1 142 9 months ago
1.2.0-beta9 187 12/3/2024
1.2.0-beta8 140 12/3/2024
1.2.0-beta7 122 11/24/2024
1.2.0-beta6 131 11/24/2024
1.2.0-beta5 151 11/24/2024
1.2.0-beta4 120 11/24/2024
1.2.0-beta3 188 11/23/2024
1.2.0-beta22 144 9 months ago
1.2.0-beta21 136 9 months ago
1.2.0-beta20 143 9 months ago
1.2.0-beta19 126 10 months ago
1.2.0-beta18 150 10 months ago
1.2.0-beta17 135 10 months ago
1.2.0-beta16 207 12/28/2024
1.2.0-beta15 167 12/27/2024
1.2.0-beta14 169 12/26/2024
1.2.0-beta13 173 12/19/2024
1.2.0-beta12 145 12/16/2024
1.2.0-beta11 175 12/12/2024
1.2.0-beta10 154 12/11/2024
1.2.0-beta1 222 8/28/2024
1.1.1-beta9 181 8/21/2024
1.1.1-beta7 207 8/21/2024
1.1.1-beta6 148 8/20/2024
1.1.1-beta5 188 8/20/2024
1.1.1-beta4 96 8/4/2024
1.1.1-beta3 134 8/3/2024
1.1.1-beta2 112 8/3/2024
1.1.1-beta1 134 7/29/2024
1.1.0 170 7/20/2024
1.1.0-beta5 117 7/29/2024
1.1.0-beta4 129 7/29/2024
1.1.0-beta3 118 7/29/2024
1.1.0-beta2 124 7/29/2024
1.1.0-beta1 154 7/28/2024
1.0.7-beta13 154 7/19/2024
1.0.7-beta12 135 7/19/2024
1.0.7-beta11 141 7/18/2024
1.0.7-beta10 137 7/16/2024
1.0.6-beta7 130 7/16/2024
1.0.0 136 7/9/2024