对于使用OpenGL的程序,我需要类似于sleep函数的东西

时间:2013-08-02 21:37:46

标签: c++ opengl

我正在使用OpenGL图形在C ++上编写游戏(奥赛罗),我需要在用户放置一块之后“等待”或“休眠”游戏。用户播放后,CPU播放速度过快,因此无法看到用户的移动。我试过睡眠功能,但它不起作用。基本上,这个想法是:

玩家插入新作品 ----睡1秒---- CPU插入一个新的

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:4)

我认为你只是在学习编程。你发现了一个重要的步骤。

人们编写的第一个代码很可能是在控制台上,它是串行的:写一个问题,等待输入,做一些事情。打印输出。这很好,许多程序都是这样的。

不幸的是,GUI没有。它们大致有三个独立的部分:

  • 电脑正常工作(比如你的游戏中的人工智能)
  • 玩家做某事,比如点击棋盘进行移动
  • 在屏幕上显示当前正在进行的操作

现在所有这些事情都会发生,而另一个事情正在发生。有些人需要等待对方。但它们基本上可以按随机顺序发生。混沌!如果玩家在AI仍在思考时点击该怎么办?也许董事会需要重新绘制,因为操作系统移动了窗口。

您没有说明您正在使用哪种操作系统,但OpenGL应该始终只做第3项。完全按照原样显示该主板。如果你想让计算机变慢,它应该在第1点。

解决此问题的经典方法是消息循环和队列。

如果您的第一个程序看起来像这样:

while ( gamenotdecided )
    ask human to enter move (wait for it)
    update board (and show it)
    compute AI move
    update board (and show it)
do

新方式更像是这样:

while ( gamenotdecided )
    get the next message:
        if it is show board: show board;
        if it is input: if it is not the humans turn print an error. 
                        else make it, and send yourself a message to show the board and start AI
        if it is AI: Do a small part of AI thinking. 
                     Send yourself a message to keep doing AI if there is no good move yet. 
                     If the AI is decided:
                         if enough time passed
                              make the move, send yourself a message to show the board
                         else 
                              wait a tiny bit and send yourself a message to do AI again 
do   

如果人工智能太快,人工智能思维的部分就是你可以等待时间的地方。关键是您可以随时显示电路板,无论是用户还是AI转向。 所有GUI操作系统也有一种方法只在一定时间后发送消息。但即使没有它,你也可以很容易地做到:如果你得到AI消息,AI知道该怎么做,但现在还不是时间,只是不做任何事情并给自己发送另一个AI消息。你的想法是推迟绘制董事会。但你真正想做的是推迟人工智能的发展。这是一个微妙但非常重要的区别。

重要的是要记住,董事会和它的“状态”总是存在。但任何消息都可以随时发生:如果用户在AI思考时点击?没问题,董事会告诉你轮到谁了。如果你需要绘制窗口,因为它被移动了?没问题,董事会就在那里,无论轮到谁。人工智能太快了?没问题,只需在更新电路板之前保持旋转一段时间。人工智能太慢了?没问题,让它考虑一下,再次发送一个展板和AI。

我希望这能解释一下你应该关注的概念。睡眠或线程与它无关。他们是优化。人们接近这种方式的一种方式称为MVC,模型,视图,控制器。在这种情况下,模型将是董事会状态,包括轮到它。视图是你的GL代码。玩家和AI都是控制器。

但首先,如果你从这里拿走一件事:GUI不是顺序的。任何事情都可能随时发生。消息队列是一种处理此问题的简单方法。

我有点好奇你正在使用哪种语言和操作系统,如果我知道的话,我可能会提供更好的例子。你使用OpenGL的任何框架吗?

答案 1 :(得分:0)

C ++ 11提供this_thread::sleep_for()作为线程支持库的一部分 如果您无权访问C ++ 11,可以尝试POSIX Threads libraries