游戏服务器开发指南(三):设计高效的线程模型

IO线程模型知识 传统阻塞 I/O 服务模型 采用阻塞 IO 模式获取输入的数据, 每个连接都需要独立的线程完成数据的输入 , 业务处理和数据返回工作. 存在问题: 1. 当并发数很大,就会创建大量的线程,占用很大系统资源 2. 连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在 read 操作,造成线程资源浪费 Reactor 模型 Reactor 模式,通过一个或多个输入同时传递给服务处理器的模式 , 服务器端程序处理传入的多个 请求,并将它们同步分派到相应的处理线程, 因此 React. 阅读详情

大家好!我是长三月,一位在游戏行业工作多年的老程序员,专注于分享服务器开发相关的文章。

一周一次的系列分享又与大家见面了。这次的主题是设计高效的线程模型,是并发类别下的第一篇。

在游戏服务器开发中,一个高效的线程模型可以充分利用多核能力,将cpu的利用率发挥到极致,并且降低请求响应时间,带给玩家尽量低的延时体验。

在许多场合需要评估是使用一个线程还是多个线程。适合分拆成多线程执行的场合是:多个任务彼此独立性高,而且单线程串行执行可能达到单核能力上限的瓶颈。下面是一个关于开房间战斗的例子,每个房间都有若干玩家一起战斗,房间之间彼此独立。原始的设计是使用单线程执行所有战斗房间的计算任务:

请添加图片描述这样设计的问题是,由于战斗计算是CPU密集型的计算任务,当房间数量增多到一定程度时会达到单核性能瓶颈,无法在原定的一帧时间内执行完所有的房间计算,导致掉帧的情况出现。解决办法是开启多个线程分担计算压力,每次有新房间创建就投放到一个最空闲的线程中管理。因为房间之间彼此独立,所以也不需要考虑任何同步相关的问题:
请添加图片描述同样典型的场景还有MMO中的大地图,由于整个地图运算量巨大,通常会考虑使用多线程分担计算量,拆分角度通常是按地图区域,每个区域分配一个线程,或者是按业务类型,每种独立的业务逻辑分配一个线程。

不过,并不是所有的任务都适合分拆到多线程。使用多线程相比单线程,至少有以下缺点:

  1. 需要更多地考虑线程之间同步的问题。这对于程序员带来了额外的开发负担,处理得不好可能导致死锁或状态错误等严重问题。而且如果同步粒度太大,会使多线程对性能的提升变得很有限。
  2. 多线程线程切换会带来额外性能开销,另外每个线程都要分配独立的堆栈空间。<
游戏思考10:游戏服务器的进程和线程简单谈谈(未完待续6/30) 文章目录一、总的看法二、1)多线程单进程2)单进程多线程3)单进程单线程 一、总的看法 之前游戏开多线程是因为机器原因,榨干CPU的全部性能,现在机器性能好了,所以基本都是多进程,每个进程都是多线程 二、 1)多线程单进程 优点 ①故障隔离,一个逻辑服务器宕机不会影响全服玩家; ②扩展性强,多个分布式部署,可以达到几万人同时在线 缺点 ①为了充分利用多核,会一台物理机会部署多个逻辑服务器,但是由于这个服务器是开了共享内存的进程,会有很多内存冗余占用; ②由于有多个逻辑服务器,得有个中控服务器异步的同 阅读详情

相关推荐

五、Netty核心技术之线程模型讲解

一、线程模型基本介绍      不同的线程模式,对程序的性能有很大的影响,为了搞清Netty线程模式,我们来系统的讲解下各个线程模式,最后看看Netty线程模型有什么优越性。      目前存在的线程模型有: 传统阻塞IO服务模型 Reactor模式      根据Reator的数量和处理资源线程池线程的数量不同,有三种典型的实现 单Reactor 单线

猿小许的博客 1950

如何设计大型游戏服务器架构?

一、游戏服务器特征 游戏服务器,是一个会长期运行程序,并且它还要服务于多个不定时,不定点的网络请求。所以这类服务的特点是要特别关注稳定性和性能。这类程序如果需要多个协作来提高承载能力,则还要关注部署和扩容的便利性;同时,还需要考虑如何实现某种程度容灾需求。由于多进程协同工作,也带来了开发的复杂度,这也是需要关注的问题。 功能约束,是架构设计决定性因素。基于游戏业务的功能特征,对服务器端系统来说,有以下几个特殊的需求: 游戏和玩家的数据存储落地 对玩家交互数据进行广播和同步 重要逻辑要在服务器上运算,做好验证

qq_38464940的博客 481

基于Netty的游戏服务器核心架构设计与实战

假设我们的协议是“4字节长度头 + 实际内容”,可以这样实现:@Override// 至少要有4字节才能读长度// 读取长度字段// 内容还没齐// 读取完整帧// 添加到输出列表Netty会自动维护一个累积缓冲区(cumulation),把零散的数据拼在一起,直到凑够一条完整消息。💡 提示:不要手动释放传入的in,Netty会在适当时候自动清理。Netty的强大,从来不只是API多么丰富,而是它所体现的工程哲学:异步非阻塞:解放线程资源事件驱动。

weixin_42603332的博客 525

游戏服务器后端开发详解与实践

Netty自诞生之初,就被设计为用于快速开发可维护的高性能协议服务器和客户端。通过减少资源消耗、提供高吞吐量、减少时延和提供强大的容错能力,Netty能够应对游戏服务器端面临的各种挑战。Protocol Buffers(简称Protobuf)是Google开发的一种数据序列化协议,用于结构化数据的序列化和反序列化。它与XML和JSON类似,但更加高效、简洁、具有更好的性能。Protobuf使用一种特定的语法定义数据结构,这种结构在.proto。

weixin_28681379的博客 714

akka-gameserver:我在Akka的游戏服务器的游乐场

Akka游戏服务器 我在Akka的游戏服务器的游乐场 开始测试基于Akka的游戏服务器的工作方式。 我将实施一个简单的游戏。 然后寻找抽象并创建一个真实的框架。 首先开始的游戏将是疯狂的八人制游戏。

在ROS中使用行为树

在ROS中使用行为树 我提供的工程示例文件: demo链接 文章目录在ROS中使用行为树0、 学习本教程的前提1、 behaviorTree 库安装(ROS使用下的安装方式)2、 处理 behaviortree 库并准备好 service 和 ros action2.1 对ROS 的 service 和 action 进行封装,使其在 behaviortree 上使用更加方便。2.2 创建一个 service 和一个 action2.3 创建与决策树相关的数据类型2.4 修改`package.xml`文件2

qq_37416258的博客 6376

springcloud+nacos+gateway+oauth2小聚会

在微服务工程中,Nacos作为目前主流的注册中心和配置中心,Spring Cloud Gateway作为目前主流的网关,下面引入spring security+oauth2+jwt作为认证和授权中心,进行简单的聊聊。

ldcaws的专栏 2646

手把手教你用VM实现欧姆龙PLC数据采集(含Fins协议配置详解)

本文详细介绍了如何使用VM(VisionMaster)实现与欧姆龙PLC的数据采集,重点解析了Fins协议(包括Fins TCP/UDP)的配置步骤。从网络环境搭建、PLC的IP地址设置,到VM端Fins通讯通道的详细配置与数据点映射,提供了完整的实战指南。文章还涵盖了数据收发解析、常见问题排查清单,帮助工程师快速完成视觉系统与PLC的稳定集成。

weixin_29171087的博客 189

PCL 读取和保存点云

PCL (Point Cloud Library) 是一个用于处理 3D 点云数据的开源库。在处理点云数据时,常见的任务包括点云的读写和可视化。PCL 提供了强大的 IO 模块来读取和写入各种格式的点云文件,并且提供了可视化模块来对点云进行渲染和显示。点云的读写与显示是很多 3D 数据处理任务的基础步骤,通过这些步骤,可以对点云进行预处理、分析和操作。

纵马踏花向自由 1739

家用扫地机器人研发技术路线-第四部分:如何一步步做出来 | 4阶段 · 从原型到量产

摘要:本文详细介绍了扫地机器人从原型到量产的研发流程,分为4个关键阶段。首先聚焦四大技术难点:SLAM定位、AI视觉识别、仿生机械臂和静音风机系统。研发过程包括实验室原型验证、工程样机测试、小批量真实场景测试和量产导入四个阶段,每个阶段设有严格评审标准。特别强调测试贯穿全程,包括模块单元测试、整机集成测试、长期可靠性测试和多样化场景模拟,确保产品在上市前完成数百次真实环境验证。整个流程体现了从技术攻关到产品落地的系统性工程思维。

智能硬件研发,欢迎交流 191

Python爬虫实战:高效爬取中国版权登记数据

本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的中国版权登记数据爬虫系统。我们将使用Playwright+Asyncio实现无头浏览器自动化,结合Redis分布式任务队列和MongoDB数据存储,打造一个能够应对反爬机制的企业级数据采集方案。文章包含完整代码实现、性能优化技巧以及法律合规建议,帮助开发者快速掌握大规模数据采集的核心技术。本文详细介绍了2024年使用Python最新技术栈构建中国版权登记数据爬虫的完整方案。基于Playwright的无头浏览器自动化。

2201_76125261的博客 1899

C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)

本文介绍如何在高速通信情况下解决串口接收的数据来不及处理的问题,由高级工程师多年经验总结而成,绝对是串口领域的实战经验!

qq_34059233的博客 6809

c\c++: Identifiers, modifier, qualifier, specifier, decorator; systemtap

文章目录参考英语含义在c、C++ 参考 c++ 标准 https://blog.youkuaiyun.com/tyronne/article/details/44016621 英语含义 modifier word or phrase that modifies (modify 2) another word or phrase 修饰语. qualifier (grammar) word, esp an adjective or adverb, that qualifies another word 修饰词; (尤指)形

mzhan017的博客 2430

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 5天带你读完《Effective Java》(五)
下一篇: 游戏服务器开发指南(四):降低同步的开销
长三月
博客等级 码龄9年 228粉丝 80原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值