关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

C#开发的游戏服务器如何优化

发布时间:2020-02-14 18:39:37

###游戏服务器优化主要考虑以下几个问题:


CPU 运算;


水平扩展能力;


内存使用;


网络IO数据流量;


硬盘使用;


###性能分析


任何性能优化之前需要首先对性能进行分析,通常使用Profile 工具,对于C#来讲通常Profile 可以使用:


VS 自带有性能分析工具;也可以使用 redgate ant 或者 和resharper 结合紧密的 dottrace;


VS自带性能分析工具可以分析程序运行时候的 CPU使用复杂;


也可以分析程序内存使用较多的部分代码;


对于网络IO需要需要自己定制性能监控工具:


###内存


VS 内存分析工具,可以分析出程序运行时间中总的内存消耗,以及内存消耗热点代码;


对于我的网络游戏服务器程序,主要是生成报文的时候,以及对象状态更新的时候,有大量的内存分配;


优化方案:复用生成的报文,这样就可以只分配一次byte数值,使用内存池来管理这些报文内存;


对于protobuff的序列化,需要消耗大量内存,这里仍然是使用对象池,创建一个可以复用的stream对象,将protobuff 序列化到这个创建的protobuff对象中,我使用的是protobuf-net ,这个库参考java的pb库实现,主要注意这个类 codedoutstream 的内存使用情况。


对于游戏PlayerActor 状态更新时候的大量内存分配,是因为之前采用复制的方式来存储多帧玩家的数据,这里修改为 采用修改更新的方式,而不是复制的方式,更新玩家上一帧数据,这样就能避免内存分配了。


###网络IO


网络需要定制工具统计:


一段时间例如10s,0.5s一次间隔内的网络状态;


包括,每个间隔中发送的报文数据量,接受的报文数据量;


发送的报文数量,接受的报文数量;


平均发送的报文大小,接受的报文大小;


这里首先在服务器内部统计每个Agent的接受发送报文数据,可以将这个数据打印到log中, 再服务器内部嵌入一个 http 服务器,这样就可以实时查看一些内部状态了。


接着实现一个python 程序定期查询这个 http服务器,采样状态,接着将采样的状态 以matlibplot 绘制为线图,这样就能直观的查看程序状态了。


同时可以分析log日志,统计每种类型报文每帧的数量,平均大小;这样就能更精细化的监控状态了。


对于程序的监控可以 参考 newrelic 这个网站。


网络流量的计算:


监控平均一个玩家,服务器发送和接受的数据量,根据这个数据量,可以简单乘以玩家的数量,得到总的数据量;


例如一个玩家 2KB/s的网络数据,500玩家就是 500*2KB = 1MB/s的网络数据



相关阅读

云南选择外包网站建设的优势云南提升网站排名的两大要素云南优秀的商城网站都会拥有这几点云南APP与小程序之间的优劣对比云南给企业选择虚拟主机时的小建议云南网站推广的方式附带价格讲解云南国内外网站之间的差异在哪里云南网站内容更新的一些小建议云南如何得知企业网站是否该更新改版云南定制开发网站的好处在哪里MySQL的备份代码C++中删除文件夹及包含的文件的方法C中matlab集合操作方法模拟鼠标点击的方法代码vs 取文件大小 字节的方法Python连接数据库的API如何获取桌面路径的方法云南首个新餐饮云平台-翼通云新餐饮应疫情上线认识什么是js闭包Python3标准库:operator内置操作符的函数接口R语言入门:矩阵和数组的运算flutter的取得成功Flink 融合 Apollo,动态性升级 Flink 工作配备C3#中如何重写object虚方法应用Visual Studio Comunity 2019开发设计Unity C#脚本制作沒有全自动补齐的解决方案C#如何快速实现完整的INI文件读写类C#设定自定文件图标保持双击鼠标起动C#中实现保持文档拖拽开启的方式WPF:客户控制库应用資源词典的疑惑The finally block does not always execute in try finallyC#:checked unchecked初识DjangoEffective C#:基于任务的异步编程flex延展性盒模型合理布局你弄懂了吗?npm环境下如何安裝Vue.js熟悉vue目录结构初步学习Vue.js关于Vue.js的条件与循环vue循环语句使用v-for 指令Vue.js计算属性关键词:computedVue.js 监听属性:通过 watch 来响应数据的变化电脑浏览器中普遍的html词义化标识运用chrome的overrides实时调试网上jsnodejs对字符串数组开展base64变换和分析关于js中函数的默认值与动态参数arguments的总结jquery幻灯片淡入淡出组件封装node 上传照片到七牛jquery滑动效果的运动模块封装ES6:教你用js面向对象思维来实现 tab栏增删改查功能前端的js构造函数和原型通过H5C3完成响应式网页(VIVO官网)ES6中的class(类)如何正确使用pocsuite3Apache Solr JMX服务项目 RCE 系统漏洞重现SharePoint 总体目标浏览人群SharePoint 2016 建立空白页网站Apache Shiro 授权关于2020年JAVA大厂笔经面经分享idea激话实例教程(永久性)适用2019 3.1 测试Go技术性人民日报(2020java map中根据value排序取前nFlutter中的this和this.widget有何差别?应用pandas挑选出特定列值所相匹配的行关于C语言指针的学习总结Java面向对象C++中常见的涵数有哪些?python异常处理会使用到哪些关键字?java开发设计JSP学员成绩管理系统 源代码根据JSP+Servlet开发设计java商场平时智能管理系统源代码python3-cookbook认识python 初学者须知Java 比较器python3-cookbook我的潘多拉深入理解Java虚拟机中的垃圾回收云南旅游网站设计需要有那些内容云南商城网站的支付安全如何维护云南为什么我们都是不建议使用模板建站的原因云南网站建设之中最容易被忽视的读小细节云南企业网站要突显特色要建设那些栏目云南网站中不同的背景颜色代表什么云南网站优化之程序优化云南医疗行业网站建设的注意事项云南网站后期的运营费用组成部分云南手表行业网站设计要点C#与Windows Form之间正确传值方法代码C++中如何产生不重复的随机数非常使用的技巧:次要关键字排序方法Matlab字符串分割详情取模(mod)与取余(rem)是一样的吗?如何区分?matlab svd 和 eig 之间如何区分C#中使用PictureBox来播放视频的代码分享Linux中使用内存映射文件MMF实现大数据量导出时的内存优化关于3年多前端菜鸡的面试及知识梳理与总结PyCharm教程安装,Python开发人员的强有力专用工具《Java 8 in Action》Chapter 12:新的日期和时间API环球在线新闻中心杨主任对我司谭昱同志的表彰【第7篇】如何理解asp.net core 3.x Identity系统Visual Studio Code如何设置Blazor clientEF CORE中复杂类型的映射
/template/Home/Zkeys/PC/Static