使用 Boost:Asio 的游戏服务器如何异步工作?

2024-05-13

我正在尝试创建一个游戏服务器,目前我正在使用线程来制作它。每个对象(玩家,怪物)都有自己的带有 while(1) 循环的线程,在其中执行特定的功能。

服务器基本上是这样工作的:

main(){

//some initialization

while(1)
{
//reads clients packet
//directs packet info to a particular object
//object performs some functions
//then server returns result packet back to client
Sleep(1);
}

我听说让服务器使用这样的线程效率不高, 我应该考虑使用Boost::Asio,并使函数异步工作。 但我不知道服务器将如何工作。如果有人能解释此类服务器的基本工作原理,我将不胜感激。


每个对象(玩家、怪物)都有自己的线程。 我听说让服务器使用线程效率不高 像那样

你是对的,这不是一个可扩展的设计。考虑一个大型游戏,您可能有 10,000 个甚至 100 万个对象。当每个对象需要一个线程时,这种设计很快就会崩溃。这被称为C10K问题 http://www.kegel.com/c10k.html.

我应该考虑使用 Boost::Asio,并使功能正常工作 异步地。但我不知道服务器将如何工作。 如果有人能解释一下基本上是如何这样的,我将不胜感激 服务器工作。

您应该从遵循 Boost::Asio 开始教程 http://www.boost.org/doc/libs/release/doc/html/boost_asio/tutorial.html,并特别注意异步 TCP 日间服务器 http://www.boost.org/doc/libs/release/doc/html/boost_asio/tutorial.html#boost_asio.tutorial.tutdaytime3. The 异步的概念 https://stackoverflow.com/a/5291002/283302在您了解程序流程是相反的之后,与同步编程相比,编程并不困难。从较高的层次来看,您的游戏服务器将有一个由以下事件驱动的事件循环:boost::asio::io_service。过于简化,它看起来像这样

int
main()
{
    boost::asio::io_service io_service;
    // add some work to the io_service

    io_service.run(); // start event loop

    // should never get here
}

从事件循环调用的回调处理程序会将操作链接在一起。也就是说,一旦调用从客户端读取数据的回调,处理程序将启动另一个异步操作。

这种设计的美妙之处在于它将线程与并发分离。考虑游戏服务器中长时间运行的操作,例如从客户端读取数据。使用异步方法,您的游戏服务器不需要等待操作完成。当操作代表内核完成时,它将收到通知。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Boost:Asio 的游戏服务器如何异步工作? 的相关文章

  • 如果我无限期地在后台运行 Android 线程会发生什么

    Android 文档表明 Oreo 对后台执行有新的限制 https developer android com about versions oreo background https developer android com abou
  • Java 中的 64 位赋值在 32 位机器上是原子的吗?

    如果我有这样的代码 long x x 0xFFFFFFFFL 如果我在 32 位机器上运行此代码 它是否保证是原子的 或者读取 x 的不同线程是否可能获得不完整 垃圾值 这是简短的摘要 作为参考 读 写是ALWAYS原子 即使在 64 位实
  • 使用 gtest 模拟 boost 共享内存派生类

    我有一个简单的 CPP 类 存储项目的一些配置 此类使用 boost 进程间共享内存进行存储 因此可以从我的服务器上运行的不同进程进行访问 现在 我想对我的程序运行一些测试 所以我想模拟我的共享内存对象的功能 为了使用 gtest 做到这一
  • 利用 SLURM 上的所有 CPU

    我想在集群上运行作业 不同节点上有不同数量的 CPU 我不知道哪些节点将分配给我 正确的选项是什么 以便作业可以在所有节点上创建与 CPU 一样多的任务 bin bash l SBATCH p normal SBATCH N 4 SBATC
  • Objective-C 2.0中的多线程问题

    我有我的主应用程序委托 其中包含一个返回对象的方法 该应用程序委托在主线程上运行 我还有一个在不同线程上运行的 NSOperation 除了希望有时能够在主线程上调用我的应用程序委托方法之外 我还需要从 NSOperation 线程中调用它
  • 分配内存时线程争用

    在 C 中 我运行了一个创建许多小对象的玩具代码 我知道最好应该避免这种情况 我只是想研究这个问题 对于创建的对象总量相同 一个线程的运行速度比每个处理器一个线程 Parallel For 的运行速度快 原子操作包括创建一个包含 20k 个
  • 当Java中set已经是原子的时候,为什么我们还需要compareAndSet呢?

    因为原子意味着线程安全 当 set 本身在java中是原子和线程安全的时候 我们什么时候使用compareAndSet 举例来说 我想以原子方式设置一个变量 以便每个其他线程都可以看到它 但我希望以线程安全的方式设置该变量 我可以简单地将其
  • 使用 boost 和 Visual C++ 2005 解压缩 zip 文件?

    boost中有没有可以用来解压zip文件的库 boost iostreams http www boost org doc libs 1 41 0 libs iostreams doc index html has a gzip http
  • 可疑地使用“else”与 i/o 结合,看到“;”靠近“如果”

    以下是导致此问题的代码 if fromProc 0 MSG SLEEP nempty proc2clk 0 gt proc2clk 0 fromProc 0 Woke up fromProc 0 MSG SLEEP fromProc 0 M
  • Hibernate 使用大量线程

    在我的独立应用程序中 一次性生成超过 1000 个线程 每个线程都有自己的 Hibernate 会话 但在这种情况下 会话计数超过数据库最大连接限制 从而引发错误 我尝试过设置 getCurrentSession 代替 openSessio
  • 使用嵌入式引用计数器时,ThreadSanitizer 报告“操作符删除时的数据竞争(void*)”

    请看一下下面的代码 include
  • Java Thread.sleep() 实现

    有人可以帮我理解 Thread sleep 函数是如何实现的吗 当指定时间过去或其他线程中断时 线程恢复 唤醒 我有兴趣了解其工作背后的设计模式 据说睡眠对CPU消耗没有影响 当前线程是否已添加到侦听器列表中 什么时候检查中断标志 调度程序
  • Java中如何杀死正在等待阻塞函数调用的线程?

    我有一个线程 Thread t new Thread public void run ServerSocketConnection scn ServerSocketConnection Connector open socket 1234
  • 如何获取线程执行完成事件

    我正在创建一个新线程来调用其中的函数 Thread th new Thread My Function th start 我想在这个线程执行完成后做一些事情 有什么办法可以做到这一点吗 至少有两种可能的解决方案 后台工作者 Use a Ba
  • 当 Activity 返回前台时,AlertDialog 不可见

    我写了一个程序支持下载文件 在此下载活动中 我启动一个进度条 然后运行一个线程来执行下载操作 该线程向 UI 线程发送消息以通知已频繁下载了多少个 在主 UI 线程中 我在收到消息时更新进度条显示 如果下载过程中出现任何问题 它会发送另一条
  • 易失性数组 C++

    我有一个应用程序 它有一个指针数组MyObject对象 MyObject arr arr new MyObject 10 应用程序有两个线程 这些线程会创建和删除new MyObject 排列arr 所以arr n 会一直改变 但是MyOb
  • PHP 中的并行处理 - 你是如何做到的?

    我目前正在尝试在 php 中实现一个作业队列 然后 队列将作为批处理作业进行处理 并且应该能够并行处理一些作业 我已经做了一些研究并找到了几种实现它的方法 但我并不太了解它们的优点和缺点 例如 通过多次调用脚本来进行并行处理fsockope
  • java中类级锁是如何实现的?

    我知道锁定概念与同步静态和非静态方法分别锁定类和实例 我无法理解的是 类级锁是如何实现的 我的意思是 类只是一个模板 没有物理意义 那么 当我们说类级锁定是通过同步静态方法来实现时 会发生什么呢 该类的所有对象是否都被锁定或被其他进程锁定
  • 使用 std::mutex 实现类的交换

    假设我们有一个class with a std mutex class Foo std mutex mutex std string str other members etc public friend void swap Foo lhs
  • Java 内存错误:无法创建新的本机线程

    运行 java 服务器时 我在 UNIX 服务器上收到此错误 Exception in thread Thread 0 java lang OutOfMemoryError unable to create new native threa

随机推荐

  • 我可以通过链接分享我的私人 GitHub 存储库吗?

    我在 GitHub 上的私人存储库中有一个 Java 应用程序 我想与没有帐户的人共享它 我在网站上没有找到任何与此相关的选项 有没有办法做到这一点 协作者只能是 GitHub 用户 无法在非 Github 用户之间共享私有存储库 您需要
  • 使用 XPath 3.1 fn:serialize 进行 JSON 序列化

    我在 Saxon HE 9 8 中使用 XSLT 3 0 并且希望将 JSON 文档用作链接数据JSON LD https json ld org 在 JSON LD 中 完整的 HTTP URI 通常显示为值 当我使用 XPath 3 1
  • 插入并发问题-多线程环境

    我有一个问题 即使用完全相同的参数在完全相同的时间调用相同的存储过程 存储过程的目的是获取记录 如果存在 或创建并获取记录 如果不存在 问题是两个线程都在检查记录是否存在并报告错误 然后都插入新记录 在数据库中创建重复记录 我尝试将操作保留
  • 钛金 Android 导航组

    您好 我是钛合金新手 它允许开发人员创建跨平台应用程序 我需要创建一个适用于 Android 和 iOS 的导航组 有没有明确的解决方案 因为 Ti UI iPhone createNavigationGrou 仅适用于 iphone 谢谢
  • Itunes Connect 测试飞行公共链接有效性

    苹果最近为试飞版本启用了公共链接功能 我们可以与任何人共享此链接 他可以使用此公共链接安装应用程序 此公共链接背后的构建有效期为 90 天 我的问题是 与用户共享公共链接后 我们可以增加构建的到期时间吗 这样公共链接的有效性就会增加 我们不
  • 将颜色映射到plotly go.饼图中的标签

    我正在使用 make subplots 和 go Pie 绘制一系列 3 个饼图 我想最终将它们放入破折号应用程序中 用户可以在其中过滤数据并且数字将更新 如何将特定颜色映射到变量 以便男性始终为蓝色 女性始终为粉红色 等等 您可以使用 c
  • 使用 Terraform 管理访问 RDS 数据库的凭据时出现问题

    我通过 Terraform 创建了一个秘密 该秘密用于访问也在 Terraform 中定义的 RDS 数据库 并且在秘密中 我不想包含username and password 因此我创建了一个空密钥 然后在 AWS 控制台中手动添加凭证
  • 在继承的ctypes.Structure类的构造函数中调用from_buffer_copy

    我有以下代码 class MyStruct ctypes Structure fields id ctypes uint perm ctypes uint 定义类后 我可以直接从缓冲区复制数据到我的字段上 例如 ms MyStruct fr
  • 一个新的 JavaScript 数组长度是否无法使用? [复制]

    这个问题在这里已经有答案了 根据MDN 文档new Array length https developer mozilla org en US docs Web JavaScript Reference Global Objects Ar
  • 将数值数据更改为分类数据 - Pandas [重复]

    这个问题在这里已经有答案了 我有一个 pandas 数据框 其中有一个数字列 金额 金额从 0 到 20000 不等 我想将其更改为定义范围的分类变量 因此 分类变量将是 0 1000 之间 1000 2000 美元之间 依此类推 直到 1
  • 多个where条件codeigniter

    如何将此查询转换为活动记录 UPDATE table user SET email email last ip last ip where username username and status status 我尝试将上面的查询转换为 d
  • JavascriptCore:在 JSExport 中将 javascript 函数作为参数传递

    JavascriptCore是iOS7中支持的新框架 我们可以使用 JSExport 协议将 objc 类的部分内容公开给 JavaScript 在javascript中 我尝试将函数作为参数传递 像这样 function getJsonC
  • dmvnorm MVN 密度 - RcppArmadillo 实现比 R 包慢,包括一些 Fortran

    The solution现已上线RCPP画廊 http gallery rcpp org articles dmvnorm arma 我从 RcppArmadillo 中的 mvtnorm 包重新实现了 dmvnorm 我有点喜欢犰狳 但我
  • docker-compose mysql 容器拒绝访问 wordpress 容器

    我遇到 mysql 5 7 容器拒绝访问 wordpress 容器的问题 我正在使用 docker compose 并且在 Mac OSX 上运行 docker Docker 应该是可用的最新版本 这是我的 docker compose y
  • Python 和 sqlite3.ProgrammingError:不允许递归使用游标

    我写了一个像这样的Python程序 它应该在多线程模式下运行 def Func host cursor db cursor execute SELECT If index Username Version Community Ip traf
  • 如何检查是否启用了更改跟踪

    我试图在运行之前确定我的数据库是否已启用更改跟踪ALTER DATABASE命令来启用它 我试图防止这些脚本多次运行时出现错误 我签到了sys databases and sys dm tran commit table但无法找到我要找的东
  • 在 React.js 中有条件地设置 html 属性

    我在为 React 中的单选按钮组件设置默认选项时遇到了令人惊讶的困难 这是我的RadioToggle成分 jsx React DOM var RadioToggle React createClass render function va
  • VideoCamera 获取支持的分辨率

    我使用 DirectShow 库 DirectShowLib 2005 dll 和 C 来捕获摄像机图像 当我定义捕获对象的大小时 我有以下参数 const int VIDEOWIDTH 640 Depends on video devic
  • std::enable_if 和 std::enable_if_t 有什么区别?

    C 14 引入std enable if t 它和有什么区别std enable if 使用上有什么优点或者区别吗std enable if t std enable if t 是 std enable if 的内部 type 的类型别名
  • 使用 Boost:Asio 的游戏服务器如何异步工作?

    我正在尝试创建一个游戏服务器 目前我正在使用线程来制作它 每个对象 玩家 怪物 都有自己的带有 while 1 循环的线程 在其中执行特定的功能 服务器基本上是这样工作的 main some initialization while 1 r