MMO 游戏中使用多核
MMO 游戏中使用多核
如果游戏中一个会话中的玩家数量只有数十人则服务器开发还算容易。我们可以用单线程模式开发游戏服务器,之后根据CPU内核数量运行游戏服务器进程就可以简单实现
但MMO游戏就不同,一个会话中会有数千名玩家。此时如果游戏服务器为单线程模式则使用1个CPU内核就会达到性能极限。
要解决这个问题1个MMO游戏服务器进程就要运行多个线程。
Windows服务器中可以用IOCP方便地开发thread pooling。但Linux要用epoll,而epoll是适合单线程的API。因此很难实现thread pooling。
这个问题我们也解决了。尽管是Linux但还是用了thread pool并在每个线程李都有epoll对象。并且每个epoll都配有socket。
不管用epoll还是IOCP,游戏服务器中消耗较多时间的是socket API的send函数。MMO游戏服务器的逻辑处理时间较短,但send函数会用较长时间。
使用Proudnet的IP摄像头 ‘Forview Pixie’
这个问题我们也解决了。方法是在thread pool中调用send函数。MMO游戏服务器中会经常向多个Client同时发送player或NPC人物的action。这个部分也会成为性能瓶颈。
能快速处理这个部分的方法就是减少访问Socket的message queue过程中发生的lock次数。当然这个lock时间很短所以也可以用spin lock。但无论是spin lock还是 mutex只要发生contention性能就会受到严重的影响。为了解决这个问题我们开发了low context-switch loop算法。low context-switch loop中会尝试各种socket message queue的try-lock,如果try-lock失败会直接跳过。接着access剩余所有message queue之后在整合跳过的message queue重新try-lock。
用这个方式我们获得了很好的成果。
这个算法非常有效。尽管MMO游戏服务器是单线程的且服务器的逻辑运算量较少,但解决了异步socket API用时较长的问题。
因这个特点,很多MMORPG都用了Proudnet。
在中国经历过的新鲜事
在韩国玩中国游戏或在中国玩韩国游戏的情况并不多,但还是有一些。我们在其中发现了一个很奇怪的现象。
左侧的设备在中国,右侧的设备在韩国。在左侧设备中发送ABC, ACD, AEF的消息。在右侧设备中接收这些信息,但让人惊讶的是收到的消息里还有左侧设备未曾发送的消息。
我们用了数据包分析工具。甚至在数据包分析工具中也发现了未曾发送过的数据包。当然在发送端的数据包分析工具中只显示正常发送的消息。
这是为什么呢?是被黑了吗?
正确的原因我们现在还不知道。希望有人看到这个文章后能告诉我们是什么原因。我大胆猜测有可能是中国的国家防火墙上是否有一些操作。
我们解决这个问题的方法是每次都要改一下数据包头的内容。
利用这个方法发送端和接收端的数据就一致了。
初次之外我们还发现和解决了很多问题。我们已经解决了PMTU discovery fail的部分网络环境中的通讯故障问题,MMO游戏中与多名玩家进行P2P连接和断开的反复过程中所发生的连接问题等。
同时使用基于TCP实现C/S networking、UDP和P2P开发游戏难度非常大。但得到的也很多,用这种方式就可以精确处理游戏中人物敏捷的动作。
使用Proudnet的PC网络游戏洛奇英雄传
分布式服务器和数据库cache
商用化网络游戏中只用一台游戏服务器的情况几乎没有。
因为我们不知道并发连接数会达到多少。
为此我们要在服务器引擎上创建多个分布式处理服务器以便处理大量并发连接。
网络游戏中游戏服务器做的最多的事情是加载和保存玩家信息。大部分情况下会存储到数据库中,但游戏服务器开发人员不喜欢去操作数据库。
开发游戏服务器时编写数据库查询语句其实是很烦的意见事情,而且如果数据库弄不好就会大幅降低服务器性能。
使用Proudnet的手机FPS游戏 Final shot
我们推出Proudnet的时候游戏服务器开发者们告诉我们这些内容,于是我们开始关注游戏服务器开发者们会以什么样的模式去访问数据库。幸运的是我们开发游戏服务器的经历较长所以很容易就找到了这个模式。
游戏服务器开发者访问数据库的典型的类型就是write,类似于套装游戏里将玩家数据频繁写入磁盘。游戏开发者不喜欢多处理器编程,他们希望玩家数据在数据库中的存储应该是异步处理的。
我们了解到这点之后提供了单方向数据访问(unilateral data access) API。这个功能我们称之为Database cache。
游戏服务器开发者只要在游戏服务器中调用我们提供的函数即可,函数的变量中就可以放入”哪个玩家的哪个工具变成了什么工具”等内容。我们的函数是异步执行的,所以函数会立即返回结果。因函数的返回速度快所以开发人员也不会出现线程的错误。如果没有这些,开发者的一个失误就可以导致并发连接的剧增和服务器处理速度的骤降。
但这些也并不充分,使用这些功能的游戏企业又找到了新的问题。我们刚开始实现的功能只能支持一台游戏服务器访问玩家John的信息,但游戏开发者们希望在其他的服务器上也要访问John的信息。
上图中左上角是游戏服务器,左下角是工具交易服务器,中间是DB cache,右上角是DB。
玩家John的数据在游戏服务器,他的最新状态缓存在游戏服务器内存中,我们需要实现的是右下道具交易服务器能安全地访问游戏服务器中John的数据。
为此我们又开发了非独占访问(non-exclusive access) API。使用非独占访问AIP,则其他的服务器就可以间接访问内存中缓存的数据。我们开发的非独占访问API类似于多处理器编程中使用的atomic operation。
链接一: ProudNet上市后问题的发生和解决的攻防战
链接二: MMO 游戏中使用多核
链接三:服务器引擎稳定性测试
转载于:https://my.oschina.net/ProudNet/blog/717750
MMO 游戏中使用多核相关推荐
- buff系统 游戏中_如何实现一个强大的MMO技能系统——BUFF
前言 Buff模块可以说是技能中最核心又最复杂的系统了.一个优秀的Buff系统能够让策划的创意得到最大限度的发挥,大幅增强游戏的战斗深度和可玩性,并且同时也能让开发者轻易的扩展维护,支持更多的效果和功 ...
- 状态同步的mmo网络游戏中的帧率
疑问: mmo网络游戏中, 玩家操作自己A角色在游戏客户端放了1个技能, 游戏服务器收到这个"A放了技能"的指令, 游戏服务器计算这个技能的结果(比如B受到了攻击掉血,A减少魔法值 ...
- 走进游戏中的美术:游戏美术风格介绍
本文首发网易游戏学院 如果把游戏比作一场舞蹈演出,游戏的核心玩法是舞蹈本身,那么游戏的美术风格则是舞蹈演员,一位优秀的舞蹈演员能更好的与舞蹈结合,传达舞蹈寓意,赋予舞蹈生命,展现舞蹈的灵魂,美术风格即 ...
- 游戏中常用的设计模式
内容会持续更新,有错误的地方欢迎指正,谢谢! 设计模式存在的意义:大多数是为了保证"低耦合高内聚" 1.单例模式 一个类只能有一个实例,单例非常重要经常用,比如游戏页面管理,现在我 ...
- 多人联机游戏中联网模块(Socket)的设计和各种问题解决
这是我自己做的一个多人联机游戏中网络部分的总结.全部为自己全新做的,没用开源软件(有一个网络游戏开源软件Raknet).目的是写一个属于自己的可靠网络模块,修改.扩展后在很多地方都能用得着.也想自己从 ...
- 漫谈游戏中的人工智能
今天我们来谈一下游戏中的人工智能.当然,内容可能不仅仅限于游戏人工智能,还会扩展一些其他的话题. 游戏中的人工智能,其实还是算是游戏开发中有点挑战性的模块,说简单点呢,是状态机,说复杂点呢,是可以帮你 ...
- SNS游戏中的数据特征随笔
我们正在开发的一款游戏有MMO的特征,就是有任务,有战斗:同时又存在大量SNS行为,比如某个角色宠物可以找某个离线好友角色的宠物战斗,找离线角色的宠物修行等.估计目前SNS类的游戏都有这两种用户行为. ...
- SNS游戏中社区Server和游戏Server一种数据交互的策略
SNS游戏和MMO类的游戏最大的区别是不分在线和离线状态.SNS游戏中存在大量的某个角色对另外一个离线角色交互. 我们拿农场类游戏举例.像偷菜之类的功能都在社区Server(SS)中实现.偷菜之外,我 ...
- SNS 游戏中社区 Server 和游戏 Server 一种数据交互的策略
SNS游戏和MMO类的游戏最大的区别是不分在线和离线状态.SNS游戏中存在大量的某个角色对另外一个离线角色交互. 我们拿农场类游戏举例.像偷菜之类的功能都在社区Server(SS)中实现.偷菜之外,我 ...
- 设计师应合理设置游戏中的机率因素
作者:Soren Johnson 设计师开发游戏的一个强有力工具是机率,通过随机机会决定玩家行为结果或创建游戏环境.但借助运气元素也存在缺陷,设计师需把握其中取舍--什么机会元素能够植入游戏中,什么时 ...
最新文章
- nginx php-fpm 运行原理
- UVA11549计算器谜题
- 学好SQL--MySQL简单使用(3)
- python 读取wav 音频文件的两种方式
- 项目常用第三方库 Swift版
- Eigen入门之密集矩阵 2-- Matrix及Vector的计算方法
- 程序员找工作那点事儿
- 2021最新基于会话推荐系统长文综述
- 【优化预测】基于matlab遗传算法优化BP神经网络预测【含Matlab源码 1376期】
- linux没找到unzip命令,linux中提示没有unzip命令解决方法如果你如法使用unzip命令解压.zip文件,可能是你没有安装unzip软件,下面是安装方法命令: yum li...
- 瞬间“友尽”的五大整蛊代码,快去安排你的小伙伴吧!
- 宋宝华Linux培训笔记-Linux系统开发与工具
- 如何进入百度、阿里,一个6年Android老司机的面经
- 移动警务整体解决方案_辅助或替代人类的技术无法解决警务问题
- java的8年来工作汇总
- lighttpd服务器搭建教程
- css 打造3D导航
- penghui_031413 Bat命令学习
- 安卓逆向010之实战破解内购(斗地主)
- php手册3.1,thinkphp3.1手册下载|
热门文章
- C语言————鸡兔共有30只,脚共有90只,下面的程序段是计算鸡和兔共有多少只?
- C. Annoying Present(思维+数学)
- 对日ODC与欧美ODC技术分析
- Elasticsearch 索引
- 【Unite Tokyo 2018】虚拟YouTuber电脑少女Siro「2018年资源推荐
- 使用 Shiro 配合微信小程序或者app登录,做验权
- matlab里面box on啥意思,image – Matlab图片中的Box on和axis坐标
- c语言生成excel文件简书,iOS 生成Excel xlsx文件
- codeblocks 编译器设置方法 也可以酱紫滴
- android 画圆形 bitmap,在android中画圆形图片的几种办法