关于我们

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

< 返回新闻公共列表

游戏服务器多线程如何通讯

发布时间:2022-09-19 17:44:16

在游戏服务器中,线程的管理是重中之重,因为线程的数量不能太多。所以为了提高游戏服务器的并发性,需要加快线程中业务的处理速度,不要长时间堵塞线程。比如不能有网络io,磁盘IO等耗时的操作。因此,我们将根据需求分配有限数量的线程。线程的主要分配方法如下:


1、IO线程与客户端


负责接收客户端消息和向客户端发送消息。


2、处理玩家事务的逻辑线程


负责业务逻辑的处理和计算。


3.处理rpc或数据库同步的网络线程。


负责不同服务之间的通信。


4.用于处理日志的磁盘IO线程


游戏中多线程之间如何通信?


相应的线程执行自己的时间。但是这个时候,问题就来了。由于这些线程是根据用途来分配的,所以不同线程之间的数据交互不会是自由的。举个例子,比如玩家登录排队,假设一个区域有一台物理机,一个IO线程处理客户端,16个业务逻辑线程,三个线程请求数据库。其他的先忽略。此时,服务器接收客户端登录请求,业务线程接收该请求。首先要做的是检查数据库中的用户信息。因为业务逻辑线程由多个用户共享,所以不能在这里等待数据库请求的返回,否则会被其他业务逻辑处理卡住。最好的方法是将这个请求封装到一个事件中,并发送给数据库同步线程来处理。等待数据库线程完成处理,然后把结果告诉业务逻辑线程,再处理业务。这时候处理的数据都在内存里,所以速度很快,处理完再返回客户端。


有人说,这不是卡登录吗?是的,您必须登录,因为只有三个线程处理数据库。mysql的查询性能测试如下:


游戏中多线程之间如何通信?


我们以1500来计算3线程的数量,所以只有当登录并发达到1500时,才会感觉服务变慢(实际情况可能更低)。如果并发能达到这么高,说明游戏很火,可以等着数钱了。如果人多,可以用排队功能。您可以查询数据库线程中等待执行的任务数量。如果它达到某个值,您可以在业务服务中将排队的任务返回给客户机,并让客户机稍后请求它。


回到正题,那么游戏服务器线程之间如何传输数据呢?可能每个人的做法不一样。这里只是其中之一,希望能给你一些参考。就当是交流学习吧。如果有更好的方法,也希望大家评论分享。


Java中多线程交换数据,即线程A给线程B一个请求事件,线程A也得到线程B的执行结果,比如login。请数据库线程检查数据库,检查后告诉逻辑线程。Java提供了一个Future/Callable机制,你可以详细地自动使用它们。但是它们有一个缺点,就是线程A在得到结果的时候是同步的(调用future.get()),如果线程B没有完成执行,线程A还是会卡死。这说明不是我们想要的。对此,我们伟大的异步框架netty的作者给出了一个解决方案,就是Future/promise模式。在这里,我暂时不分析它的源代码。有时间再写篇文章解释一下。有兴趣的同学可以自己查一下。以下是它的使用方法。


无忧云为网游运营公司提供高性能、高可用、可扩展、高性价比的IDC数据中心解决方案!详情请联系在线客服!


/template/Home/News/PC/Static
var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?3055b648e71c7d34d18c96db95a87337"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();
客服中心
点击二维码下边按钮可通过微信联系客服进行沟通
QICQ支持
处理:机器咨询,产品优惠,售后处理服务器状态异常等,10分钟内响应
微信支持
工单服务
提交工单:在线工单入口
工单处理:网络延时,机器状态异常,网站备案等,10分钟内响应
投诉/合作
滥用举报:abuse@wuyouyun.com
商务合作:business@wuyouyun.com
服务投诉:微信处理入口
处理:投诉,建议,代理,大客户,我们会全力以赴满足您的服务请求