首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >多线程回调

多线程回调
EN

Game Development用户
提问于 2021-01-06 18:06:21
回答 1查看 114关注 0票数 1

我正在制作一个多人游戏,玩家在车辆中战斗,我怀疑我的服务器架构。由于这将是物理,网络和人工智能密集,我想把这三个主题分成自己的线程。也许每一个AI甚至有一个线程。

物理线程将运行在一个固定的时间步骤,并做同样的循环一遍又一遍。

  1. 在固定时间步长为0,005s (200 of )时积分游戏状态
  2. 求解约束和collisions约束的一个约束条件是车辆控制器,它是一个由油门、转向、刹车等组成的struct应用于单个车辆。
  3. 回调
    1. 该网络被称为每6个物理帧,因此网络运行在~33赫兹。
    2. AI也被称为每6 frames.注意:网络和人工智能可以被一步步调用

AI线程将在需要的基础上计算下一个动作.

  1. 将游戏状态复制到私有内存中
  2. 计算下一步行动
  3. 更新游戏状态中的车辆控制器

网络线程将

  1. 侦听传入的UDP数据包,处理它们,将更改应用到游戏状态,如播放器的车辆控制器、子弹产卵器
  2. 当需要时,向客户端广播新的游戏状态
    1. 将游戏状态复制到专用缓冲区中
    2. 创建与上一状态的差异数组
      1. 移走/添加车辆部件
      2. 车辆部件移动/旋转
      3. 球员加入/左
      4. 弹丸撞击和破坏

代码语言:javascript
代码运行次数:0
运行
复制
1. Pack the differences together and broadcast.
  1. 新玩家加入时:
    1. 获取最后一个私有游戏状态缓冲区并将其全部发送出去。
    2. 通过生成车辆和分配控制器来改变游戏状态

我有什么问题:

  1. 动态创建线程是有开销的,所以我想通过预先创建和“停车”线程来避免它,并在需要时调用它们。一旦被调用,他们就会履行他们的职责,比如计算AI的下一步行动。然后线程"hibernate“。请注意,我不希望线程在繁忙的循环中等待,并为“激活”读取一些共享内存。
  2. AI和网络线程需要制作游戏状态的私有副本,因为物理运行速度太快,游戏状态可能会在读到一半时发生变化。
    1. 缓解1:交换游戏状态缓冲区。还是不能保证。
    2. 缓解2:锁定游戏状态。这是个坏主意,因为物理学不应该被耽搁。

我如何在C++中实现这一点?x86是否为此提供了实际的中断?其他架构如何,或者是否有一些库为我做到了这一点?

还是我该换一种方法?

EN

回答 1

Game Development用户

发布于 2021-01-07 11:44:35

  1. 当您推送一个事件时,std::condition_variable将允许您wait_for event_queue.has_event(),您可以notify_one来唤醒等待的线程。但是,这样做的缺点是,您依赖于调度程序来真正唤醒线程。然而,调度程序的解析可能比您预期的要大。
  2. 如果只有一个线程在操作游戏状态,那就更好了。因此,而不是你的AI线程直接进行更新,而是向物理线程发送信息,说明如何更新AI结构。同样地,网络也是如此。

您可以采取只读快照的游戏状态,以作出人工智能的决定。这可以使双缓冲更容易。

AI线程使用两个缓冲区:从最后一个状态读取和写入到新状态。然后,更新完成后,它将新写入的状态设置为最新状态。另外两个线程可以读取锁定最新的缓冲区来做出决定。确保您有足够的资源来为下一次写入时分配一个未使用的缓冲区。在您的情况下,您需要5个游戏状态缓冲区,2个用于网络线程,1个用于AI,2个用于更新线程。

票数 1
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/188198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档