C#游戏服务器开发框架设计与架构详解

2024-09-07 08:12

本文主要是介绍C#游戏服务器开发框架设计与架构详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我一直在思考一个问题,什么样的服务端框架最好用,最适合? 经过这些年的项目经验,其实最好用,最适合的游戏服务端框架就是自己结合公司项目需求,团队特点与技术能力,自己整合的游戏框架是最好用的。

很多新手会担心自己整合的框架不能商用,这个担心完全没有必要,现在行业的发展已经很成熟,每个模块都有成熟的解决方案来提供支撑,我们要做的就是整合起来,组织我们项目逻辑的开发方式而已,所以现在的行业设计一个游戏服务端框架远比大家想象的简单和稳定。今天给大家分享一下我们最新课程《C#服务端+双端(Unity/Cocos) SLG项目实战》中服务端框架的设计模式与组织项目的思想。希望能给大家带来一些启发。

对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀!

C# 服务端所依赖的第三方基础库

先给大家列举一下我们选择的一些基础服务的框架方案,使用NuGet包管理器很方便的就安装配置好了。

DotNetty: 网络服务,http服务,WebSocket服务支撑;

Protobuf-net: 对象的序列化/反序列化;

SqlSugarCore: 基于ORM的与mysql数据库交互通讯的服务支撑;

Nlog: 对游戏服务端的日志打印提供服务支撑;

Microsoft.Extensions.Configuration: 对服务器与游戏配置的服务支撑;

Litjson: 对Json编码解码的服务支撑;

StackExchange.Redis: 对与Redis Server交互的操作服务支撑;

EnyimMemcachedCore: 对memchach的内存缓存服务支撑;

LogicLooper:对游戏服务端状态同步帧同步的帧率控制的服务支撑;

这些库我们使用NuGet包管理器安装好就可以直接开发了(如图1-1)。

图1-1: 游戏服务端项目依赖的第三方库

我们服务端开发中的所有基础模块都有成熟的第三方库,有了这些第三方库的加持,你做的游戏服务端框架,想不稳定都难^_^。

高性能高并发服务端框架设计架构流程详解

先上架构图1-2,对照架构图从左到右来看下整个框架的结构。

图1-2

关键点1: 支持多种数据通讯

支持TCP Socket, WebSocket Http三种方式与客户端进行数据通讯,拿到数据后走后续通用的工作线程来进行请求的逻辑处理。

关键点2: 多线程发挥CPU的多核优势

为了实现高性能与高并发,充分发挥服务端机器CPU的多核优势,我们采用的是工作线程池的模式来驱动迭代上层的各种服务与处理。比如,网络IO,日志打印,数据库存储,游戏业务逻辑等。

关键点3: 一切的业务流程都从Entry开始;

服务端处理的每个请求都会走统一的入口Entry,这样让我们业务逻辑的维护就可以从Entry开始了。比如账号系统相关的逻辑处理,可以写入AuthEntry中,这样后期维护的时候,遇到登录的流程维护,直接从AuthEntry开始。

图1-3

关键点3: 具体的处理流程逻辑交给Process

如上图1-3,Entry不写具体的业务逻辑,直接调用特定的Process代码, 由Processer来处理每个对应的具体业务逻辑的流程。Processer来维护流程代码,功能代码由底层框架的FrameWork,系统API函数,自己编写的功能函数等来作为服务支撑。

关键点4: 扁平化的数据对象

把服务端的每个玩家数据,Boss数据,NPC数据我们都做好扁平化设计,每个数据对象都是纯数据,没有任何的代码逻辑。这样服务端处理每个个体数据时都非常地简单与清晰,避免复杂地继承关系。如每个玩家的Entity数据,由基本信息,战斗信息,任务信息等相关组件数据组成。这些数据对象提供给Processer处理与访问。

关键点5: Framework的基础服务的支撑

Framework对整个基础的一些服务提供支撑,比如数据库服务,日志服务,网络服务等。同时针对游戏行业的需求,会有一些游戏相关的特定库的支持,比如 RVO动态避障,寻路导航,物理引擎等。C#在这块也有很多成熟的游戏相关的库。

关键点6: 业务逻辑通常开发方式

这个对于框架来说是最重要的,因为等框架做好后,就是用它来开发扩展业务逻辑。框架好不好用,团队协作是否顺畅,任务分配是否清晰就取决于它了。我们采用流程+数据的模式来开发新业务:

Step1:给新业务添加一个Entry类,并注册好对应的服务;

Step2:定义好数据通讯协议的格式结构;

Step3:定义业务逻辑功能需要的数据组件,并添加到Entity;

Step4: 编写业务逻辑对应的Processer流程,完成对应功能;

关键点7:游戏核心战斗线程的特定调度与并行扩展

与普通的业务逻辑流程处理不一样,游戏核心战斗场景,多个玩家同时战斗的处理一般在一个线程里,而不是用线程池中的任意线程调度执行。所以我们提供机制,同时游戏的玩家的同一战斗任务在一个线程中调度。不同的地图or副本等可以扩展不同的线程来提供服务。

End

纯数据结构对象扁平化,业务逻辑流程化,多线程并发调度与特定战斗线程的调度处理。业务代码流程清晰,没有过多的继承体系与模板,将简单胜于花哨。这样使得很多初始开发人员也能上手开发游戏服务端的业务。每个网络请求的处理流程非常的简单与清晰。

unity视频教程icon-default.png?t=O83Ahttps://www.bycwedu.com/promotion_channels/1189981998

这篇关于C#游戏服务器开发框架设计与架构详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144533

相关文章

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

Python装饰器之类装饰器详解

《Python装饰器之类装饰器详解》本文将详细介绍Python中类装饰器的概念、使用方法以及应用场景,并通过一个综合详细的例子展示如何使用类装饰器,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. 引言2. 装饰器的基本概念2.1. 函数装饰器复习2.2 类装饰器的定义和使用3. 类装饰

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服