我似乎找不到一个很好的答案:
我正在制作一个游戏,我希望逻辑循环与图形循环分开。换句话说,我希望游戏通过循环每X毫秒,而不管它显示多少帧/秒。
显然,它们都将共享许多变量,所以我不能让线程/计时器来回传递一个变量.我基本上只是在寻找一种方法,在后台有一个计时器,每X毫秒发出一个标志来执行逻辑循环,而不管图形循环在哪里。
我愿意接受任何建议。似乎最好的选择是有两个线程,但我不确定在它们之间进行通信的最佳方式是什么,而不需要不断地同步大量的数据。
发布于 2015-04-23 16:33:00
你可以很好地做多线程,让你的“世界观”交换每一个滴答。下面是它的工作原理:
唯一需要的锁定是发布或抓取指向世界的指针的时间。作为另一种选择,您可以执行原子交换,但是您必须确保使用智能指针可以做到这一点。
发布于 2015-04-23 16:36:51
大多数工具箱都有一个事件循环(构建在一些多路复用的syscall (如民意测验(2) -or,即过时的select
-.)之上),例如,GTK有跑 (它在:) main,它构建在Glib主事件环之上(实际上是做poll
或类似的事情)。同样,Qt有QApplication及其exec方法。
通常,您可以在事件循环中注册计时器。对于GTK,使用GTimers、添加等来了解其定时器。
通常,您还可以注册一些空闲或后台处理,这是在处理其他事件和超时之后由事件循环启动的函数之一。您的空闲函数预计将快速运行(通常在几毫秒内完成一些计算的一小步,以保持GUI响应)。对于GTK,使用添加等IIRC,在Qt中,您可以使用带有0延迟的计时器。
因此,您甚至可以使用超时和空闲处理来编写(概念上的)单线程应用程序。
当然,您可以使用多线程:通常,主线程正在运行事件循环,而其他线程可以执行其他任务。您有同步问题。在POSIX系统上,一个很好的同步技巧是使用管道(7)进行自定义:在运行事件循环之前设置一个管道,计算线程可以在它上写几个字节,而主事件循环是“侦听”它(使用GTK、使用民意测验或异步IO或GUnixInputStream等)、使用Qt、使用QSocketNotifier等)。然后,在该管道的主循环中运行的输入处理程序中,可以使用互斥等访问传统的全局数据.
从概念上讲,阅读有关延续的内容。这是一个相关的概念。
发布于 2015-04-23 14:43:57
您可以有一个抽签和更新方法附加到您的所有游戏组件。这样,您可以设置它,当您的游戏运行时,更新将被调用,抽签将被忽略或两者的任何组合。它还具有保持逻辑和图形完全分离的优点。
https://stackoverflow.com/questions/29835569
复制相似问题