在游戏服务器中,线程的管理是重中之重,因为线程的数量不能太多。所以为了提高游戏服务器的并发性,需要加快线程中业务的处理速度,不要长时间堵塞线程。比如不能有网络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数据中心解决方案!详情请联系在线客服!
客服支持
微信咨询
售后