C++ - 每 X 毫秒执行一次函数

标签 c++ multithreading opengl timing glew

我似乎找不到一个好的答案:

我正在制作一个游戏,我希望逻辑循环与图形循环分开。换句话说,我希望游戏每 X 毫秒执行一次循环,无论它显示多少帧/秒。

显然它们都会共享很多变量,所以我不能让线程/计时器来回传递一个变量...我基本上只是在寻找一种在后台有一个计时器的方法每 X 毫秒发送一个标志来执行逻辑循环,无论图形循环在哪里。

我愿意接受任何建议。似乎最好的选择是拥有 2 个线程,但我不确定在不不断同步大量数据的情况下,它们之间通信的最佳方式是什么。

最佳答案

你可以通过每次更新你的“世界观”来很好地实现多线程。所以它的工作原理如下:

  1. 您当前的世界 View 由单个智能指针指向,并且是只读的,因此不需要锁定。
  2. 您的逻辑创建您的(第一个)世界 View ,发布它并安排渲染器。
  3. 您的渲染器会获取指向您的世界 View 的指针的拷贝并进行渲染(记住,只读)
  4. 与此同时,您的逻辑会创造出一种新的、略有不同的世界观。
  5. 完成后,它将指针交换到当前世界 View ,并将其发布为当前世界 View 。
  6. 即使渲染器仍然忙于处理旧的世界 View ,也不需要锁定。
  7. 最终渲染器完成了(旧)世界的渲染。它捕获了新的世界观并开始了另一场奔跑。
  8. 与此同时,...(转到第 4 步)

您唯一需要的锁定是在您发布或获取指向世界的指针时。作为替代方案,您可以进行原子交换,但您必须确保使用可以做到这一点的智能指针。

关于C++ - 每 X 毫秒执行一次函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29835569/

相关文章:

OpenGL 多 GPU 支持

c++ - CImageList 和 CComboBoxEx 限制为 16 个透明图标

c++ - 高速缓存行大小倍数的变量的高速缓存行填充

java - 为什么两个 Java 线程(在某些情况下)比一个线程快两倍以上?

multithreading - 了解 Rust channel 。 `send` 如何工作?

c++ - 为什么要使用 glTranslatef?为什么不直接更改渲染坐标?

c++ - 从 OpenGL : Performance of FBO vs. PBO 中的默认帧缓冲区读取像素数据

c++ - QT连接没有匹配的函数可以调用

c++ - 是否有可能我有一个类的前向声明,而不是在头文件中使它们成为引用或指针

c++ - libssh 是否支持 sftp 服务器功能?