c++ - 在文本冒险中实现实时?

标签 c++ multithreading time game-engine adventure

我正在制作一个基于文本的角色扮演游戏,我真的很想模拟时间。
我可以在每次玩家输入内容之间留出一些时间,但如果可能的话,我希望它比这更好。我想知道多线程是否是执行此操作的好方法。

我在想也许只有第二个,非常简单的线程在后台,只有一个循环,每 1000 毫秒循环一次。每通过一次循环,世界时间就会增加 1 秒,玩家会恢复一点生命值和法力值。

这是多线程可以做的事情,还是有一些我不知道的东西会导致它不起作用? (如果它不能帮助我完成这个项目,我宁愿不花大量时间努力学习它。)

最佳答案

是的,多线程当然可以做到这一点,但请注意线程通常比替代方法更复杂(这将是主线程轮询各种更新事件作为其主循环的一部分,它应该至少每 100 毫秒运行一次无论如何)。

在您的情况下,如果时钟线程遵循非常严格的规则,您可能会“没问题”。

  1. 时钟线程是唯一允许设置/修改时间变量的线程。
  2. 主/ui 线程只允许读取时间。
  3. 您仍然必须使用系统时间函数,因为线程 sleep 函数的准确性不可信(根据系统事件,线程的更新循环可能要到您请求它运行几毫秒后才会运行)。

如果你这样实现它,那么你甚至不需要熟悉互斥量就可以让线程安全地启动和运行,而且你的时间将是准确的。

但是!这里有一些值得深思的问题:如果您想在一天中的特定时间绑定(bind)游戏内触发器怎么办?例如,将向用户发布的消息 “The sun has set” 或类似消息。执行此操作所需的代码无论如何都需要在主线程上运行(除非您想实现跨线程消息通信队列!),并且可能看起来非常像基本的定期检查和更新时钟代码.所以在这一点上,你最好还是保留一个简单的统一线程模型。

关于c++ - 在文本冒险中实现实时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15060148/

相关文章:

c# - 进程外 COM 缓慢

multithreading - 从 goroutine func 发出修改映射

multithreading - 属性的原子读写

java - 将 TAI 时间转换为 Java 即时时间

c++ - 鼠标移动过多,坐标始终打开

c++ - 为什么将 emplace_back 与已删除的复制构造函数一起使用不起作用?

c++ - C++ map of maps 上的细粒度锁

java - 获取时间服务器时出错 - Java

android - 如何在android中找到今天或昨天的时间

c++ - 大写字母输入不能在 cpp 程序中工作