当前位置: 首页 > news >正文

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

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

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

按照他们这个做法是副本与场景都是地图,所以就造成了下面这样的问题。假如,我有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的一点建议

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

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

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • fastap之使用 contextvars 实现上下文变量
  • Ps:首选项 - 常规
  • Unity+Addressable
  • 15.CentOS7升级内核
  • Android 关于设备定屏/黑屏/冻屏/ANR那些事
  • 【北京仁爱堂】脖子歪斜,拉扯疼痛怎么办?规律的生活让痉挛性斜颈的恢复事半功倍!
  • 微信小程序登陆
  • 【精选】基于springboot个人理财APP(源码+设计+辅导)
  • MATLAB 低版本Matlab-读取LAS格式点云文件并可视化(78)
  • C++ 设计模式——迭代器模式
  • 令牌和签名详细介绍+开发使用教程
  • 聚星文社下载地址
  • 光性能 -- OSNR,BER与Q值
  • Nginx 405 not allowed
  • WPS宏实现Sheet页合并功能
  • [nginx文档翻译系列] 控制nginx
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Angularjs之国际化
  • ES6核心特性
  • GraphQL学习过程应该是这样的
  • hadoop集群管理系统搭建规划说明
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JavaScript设计模式之工厂模式
  • Java读取Properties文件的六种方法
  • Python学习笔记 字符串拼接
  • React+TypeScript入门
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Wamp集成环境 添加PHP的新版本
  • webpack+react项目初体验——记录我的webpack环境配置
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 关于for循环的简单归纳
  • 浅谈Golang中select的用法
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 小程序01:wepy框架整合iview webapp UI
  • 学习ES6 变量的解构赋值
  • 一个项目push到多个远程Git仓库
  • 原生Ajax
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​zookeeper集群配置与启动
  • #if和#ifdef区别
  • $(function(){})与(function($){....})(jQuery)的区别
  • (3)选择元素——(17)练习(Exercises)
  • (70min)字节暑假实习二面(已挂)
  • (Charles)如何抓取手机http的报文
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (k8s)Kubernetes本地存储接入
  • (k8s中)docker netty OOM问题记录
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (二十四)Flask之flask-session组件
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (含笔试题)深度解析数据在内存中的存储
  • (计算机网络)物理层
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像