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

相关文章

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单