《晶核》服务器架构——第二篇

news2024/11/15 7:17:55

继上面的第一篇文章,没看的可以翻一下。还是进程数量多的问题?

副本问题怎么解决?服务器该如何设计?

按照他们这个做法是副本与场景都是地图,所以就造成了下面这样的问题。假如,我有1万人的在线数量,那么就需要开100个进程出来维护这1万人,这还只是在场景中; 如果,玩家要打副本,那么,按照这个设计,就需要一直开进程。一个人进副本,也是启一个进程来维护你这个玩家。2000人进副本就是2000个进程,这个开销程度可想而知。副本最多可以4人组队情况下,同时进入,这也需要500个进程。这里就产生了大量的服务器资源的浪费。

所以,他们这里的服务器解决策略是什么?

把前期推图的这些副本做出成了离线副本,就是单机的意思。进去打怪战斗的逻辑在客户端完成,装备掉落,任务完成由Logic服进行了校验。所以,他们的客户端是有战斗的, 不知道这个防作弊机制是怎么样的、关键数据,由Logic进行了校验,记录你通关的副本,奖励等等。这样确实,减少了大量的服务器进程数量。也确实解决了服务器压力的问题。但,ta这是不能组队的,不能与玩家互通的。

世界boss战,跨服如何解决?

上面提到,副本是单机,离线的。随着时间推流,玩家早晚要进Boss战的,跨服副本等等。所以,这里怎么解决?

这里直接使用了场景服务器集群,不亏是大公司!按照下图这样的计算,这一组就是八个,八个按照最多人数那样算,就是可以进行800人的战斗。当然,ta不可能放那么多人进去的。总需要留一些空余,做其它的事情,保证副本的流畅性。

性能优化!重中之重

关乎老板的钱包的多少的切身问题。合理的优化能让你省去一半的服务器开支。

这里的优化思路着重分为了两部分: CPU与内存 !还是那句DS真不是你想用就用的。


CPU的优化细节,最初的设想,就是只同步自己。按照他们那个设计, 玩家最初的出生点在一个寂静的村庄里,没有人。这里就合理的优化掉了。

后面的这些开发的业务逻辑上来了,不仅有人偶,还有宠物,都需要跟随。这里的优化是直接去掉,不同步。只有当真正需要调用到才同步

这里还接入了UE的插件,来把场景中的Actor分组出来,然后优化。网格同步其实就是AOI,只能看到视野范围内的。

摄像机背后同步是什么意思?  就是 玩家视野前后的同步频率不一样,前面的可能30帧每秒,后面可能就10帧。

不移动还用同步吗???用的,这就是DS。 所以,后期优化 直接改为了玩家不移动就不在同步。

这差不多就是属性同步上的优化策略。

物理计算为什么要优化?

这是因为DS服务器的前后端代码,放在了一起,所以前端跑动画,后端也跑动画。这无关紧要的放在服务器上,徒增了CPU计算负担!! 后面还是给分开了。前端是前端,后端是后端。

业务需要的时候再计算? 什么意思? ta这个游戏有人物抬枪射击的动作,射击需要计算射线,朝向对吧!所以,关键的动作,在这里同步一下就可以了。其它的乱七八糟的头发,装饰在前端表现就行了。

这个移动同步前面说过了。DS服务器是可靠的服务器,UDP可靠!降低频率及降低了校验频率,节省带宽!

FindFloor 是UE中的一个查找地面组件。关乎玩家角色,是否在地面上行走,斜坡上还洼地里。玩家的移动会一直不断的更新这个函数,不移动也更新的话,就显得多余了。直接降低这个函数的更新频率。

关于服务器设计特殊移动的一点思路与见解

借用一下B乎的文章。如果是单机,那就不用考虑这些了。

这就有点取巧的意思了。借客户端的优化思路,优化服务器。服务器默认按照,30帧每秒的一个频率再更新。如果CPU使用率超过百分之80会怎么样?你的手机负载超过80%会怎么样?会降频,减少计算数量。俗称掉帧! 这里的服务器也按这个策略,用来保证服务器的能够流畅的运行。

内存优化

最开始一篇的文章中,我们提到,他们的DS场景服务器是集群的,他们这一组服务器,是在同一台服务器上,所以能开出共享内存。用Linux下的fork函数去fork进程,同时又使用上了Copy-on-write (写时复制),当,有玩家触发写任务时,copy一个副本出去给ta改。不是什么新鲜事物。

优化完毕!总结,

所有,这一切,优化完了 服务器CPU与内存节省了约50%。所有的优化,都需要满足业务需求!

更新维护

在线更新,不停服,其实就是lua热更!!只适用于小规模的活动更新。大型的改动还是需要关服更新。

调度策略

这是我认为这里学到最有用的一点,通过这个调度策略,可以很有效的规避了服务器内存泄漏的等严重的服务器bug,当,场景服中存在bug,在线更新解决不了时,这个时候的做法是,把新修改的版本,布置了一个新的集群上去,这个时候的Logic服会根调度策略选择最新的版号。 这排序一下就行了。 通过这样一个轮询的机制,就把坏的版本,换了下来。客户端也不用等待服务器的开服。

这样的思路其实可以做很多事情。比如开发了新版本,新内容, 也就把滚动更新实现了。

其它挑战

时间精度

DS服务器使用了float类型,描述时间,在服务器长时间启动不关的情况下,float类型误差会越来越大,导致移动位置不准确。这里的解决是,扩充double类型。

同步顺序

这个意思是说,当场景服务器把各个actor下发时,会出现不同步的情况,下发的时序是不保证的属于有了就发这种,信息对等不上,所以这个时候就在业务层于场景之间加了一层代理,来保证同步顺序是一致的。当,都到达时,才发送,没有一直等在哪里,缓存队列那种。

无缝切图

这 不说了 懂得都懂,不懂看文档。

使用DS的一点建议

到这里,算是全部讲解完了。

这算是把后端这一套的完整的从开发到上线维护的所有细节都教给你了。

剩下的就是去执行的事情了。

你问我代码怎么写? 那我只能说,框架摆在眼前,剩下就垒砖的事情了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2072208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从源码开始:在线教育系统与网校APP的架构设计与开发实践

这篇文章将从源码层面探讨在线教育系统与网校APP的架构设计与开发实践,帮助开发者理解核心技术与实现路径,进而打造功能全面、性能优异的在线教育平台。 一、在线教育系统的核心功能模块 在设计在线教育系统时,首先需要明确其核心功能模块。…

PCL区域生长分割

文章目录 一、算法原理1、输入2、初始化3、算法二、代码部分三、代码解释参考文献本文,我们将学习如何使用 pcl::RegionGrowing 类中实现的区域生长算法。该算法的目的是合并在平滑度约束方面足够接近的点。因此,该算法的输出是簇的集合,其中每个簇被认为是同一光滑表面的一…

NASA:北极辐射-冰桥海冰实验(ARISE)2014年原地云数据产品

ARISE_Cloud_AircraftInSitu_C130_Data 简介 ARISE_Cloud_AircraftInSitu_C130_Data_1是北极辐射-冰桥海冰实验(ARISE)2014年原地云数据产品。该产品是位于华盛顿的美国宇航局科学任务局地球科学部辐射科学、冰冻层科学和机载科学计划共同努力的成果。…

Mysql高可用之组复制 (MGR)从原理到实战一篇解决

一:原理 简介: MySQL Group Replication(简称 MGR )是 MySQL 官方于 2016 年 12 月推出的一个全新的高可用与高扩展的解决方案。 组复制是 MySQL 5.7.17 版本出现的新特性,它提供了高可用、高扩展、高可靠的 MySQL 集群服务 MySQL 组复制分…

如何优雅处理异步组件加载:Vue 3 的 Suspense 特性

在日常开发中,我们可能会遇到网络不佳或内容加载时间较长的情况。如果当前页面没有任何内容提示,用户的体验非常糟糕,可能会反复刷新以便加载成功。因此,我们需要给用户提供一个加载中的效果,告知用户“我在努力加载中…

怎样快速搭建 Linux 虚拟机呢?(vagrant 篇)

作为一名Coder(程序员或码农),供职于中小型互联网公司,而你恰恰偏向于服务端,那么,产品部署在生产环境的艰巨任务,便毫无疑问的落在你身上了。 只有大厂(大型互联网)企业…

程序员:全栈的痛你不知道

上周一个同事直接对我开喷,骂我无能,说:“你怎么一个人就搞不定所有系统呢?”,我半支烟纵横IT江湖14余年,还是第一次被人这么嫌弃。 事情缘由 某公司的业务线特别多,有个业务线前后端项目共计…

新手入门:Python+Selenium自动化测试(爬虫),如何自动下载WebDriver!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 自动下载WebDriver 📒📝 安装📝 使用📝 支持主流浏览器⚓️ 相关链接 ⚓️📖 介绍 📖 好久没有使用Selenium的自动化(爬虫)了,还记得那个时候使用Python+Selenium进行爬虫项目还需要手动下载Webdriver。每次换浏…

SSRF攻击

目录 1、curl_exec函数 2、dict协议 3、file协议 4、Redis未授权访问 5、gopher协议 6、SSRF 定义: 原理: 防御: ssrf实现.ssh未创建写shell 1、环境搭建 2、实施攻击 2.1、生成公钥 2.2、用SSH公钥数据伪造Redis数据 2.3、攻…

Python | Leetcode Python题解之第368题最大整除子集

题目: 题解: class Solution:def largestDivisibleSubset(self, nums: List[int]) -> List[int]:n len(nums)nums.sort()dp [1]*nres [[nums[i]] for i in range(n)]ans res[0]for i in range(n):for j in range(i):if nums[i] % nums[j] 0 and…

ECCV`24 | 艺术文本和场景文本分割任务新SOTA 方法!华科Adobe提出WAS!

文章链接:https://arxiv.org/pdf/2408.00106 git链接:https://github.com/xdxie/WAS_WordArt-Segmentation 亮点直击 提出了艺术文本分割这一新任务,并构建了一个真实数据集用于模型性能基准测试。 设计了训练数据合成策略,生成了…

PyCharm汉化:简单一步到胃!PyCharm怎么设置中文简体

最近在弄python的项目 一起加油哦 步骤: PyCharm的汉化可以通过两种主要方法完成: 方法一:通过PyCharm内置的插件市场安装中文语言包 1. 打开PyCharm,点击File -> Settings(在Mac上是PyCharm -> Preferences…

集合及数据结构第十一节————排序

系列文章目录 集合及数据结构第十一节————排序 排序 排序的概念排序运用常见的排序算法插入排序选择排序交换排序归并排序排序算法复杂度及稳定性分析其他非基于比较排序排序练习题 文章目录 系列文章目录集合及数据结构第十一节————排序 一、排序的概念及引用1.排序…

(免费领源码)python#Django#msyql学生个性化培养的教学资源平台的设计与实现19385-计算机毕业设计项目选题推荐

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对学生个性化培养的教学资源平台等问题&#…

独角数卡,打开商品列表出现Undefined variable form的解决办法

前言 独角数卡,打开商品列表出现了ErrorException In GoodsController.php line 95 : Undefined variable: form ErrorException In GoodsController.php line 95 : Undefined variable: form#0 app/Admin/Controllers/GoodsController.php(95): Illuminate/Foundation/Boots…

应用层协议(上)Http(URL、Cookie、Session)内含逻辑图解通俗易懂!

绪论​ “少年没有乌托邦 心向远方自明朗”,本章是应用层常用且重要的协议htttp,没看过应用层建议一定先看那一篇后再看本章才能更好的去从上到下的理解应用层。 话不多说安全带系好,发车啦(建议电脑观看)。 1.Http协…

【HZHY-AI300G智能盒试用连载体验】评测视频教程

前段时间,我参加了HZHY-AI300G智能盒试用,在电子发烧友论坛和CSDN发布了相关内容。应厂商要求,录制了相关的操作视频,现在已经发在B站了,欢迎大家观看。 【RK3588】HZHY-AI300G平台应用 1. 智能盒硬件接口介绍_哔哩哔哩…

计算机Java项目|基于SpringBoot的经方药食两用服务平台的设计与实现

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参…

Python编码系列—Python中的Web安全防护:深入探索SQL注入与XSS攻击

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

【YOLO5 项目实战】(7)YOLO5 手势识别

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【YOLO5 项目实战】(1)YOLO5 环境配置与检测 【YOLO5 项目实战】(2)使用自己的数据集训练目标检测模型 【YOLO5 项目实战】(7)Y…