您的位置:首页 > 编程语言 > C#

C#游戏服务器优化

2016-05-09 00:00 260 查看
摘要: skynet,Actor

###游戏服务器代码:

http://git.oschina.net/liyonghelpme/GameServerCsharp

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

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的网络数据

当然玩家人数越多数据不一定是线性增加的,可以参考下面论文。

客户端还需要做一个自动脚本,用于开启多个客户端,每个客户端不断移动和操作,这样能比较好的模拟真实情况。

###参考资料:

http://publications.lib.chalmers.se/records/fulltext/147114.pdf
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: