在OpenGL中绘制X秒的对象

时间:2011-04-27 10:06:22

标签: opengl

在OpenGL中,一切都适用于主循环(据我所知)。如果要在给定时间内绘制对象,则会出现此问题。现在,我做的是:我测量应用程序的近似FPS并设置一个计数器,我在主循环的每次迭代中减少。当计数器达到0时,我停止绘图。因此,例如,如果我想在屏幕上绘制一个2s的对象,并且我的FPS是30,我将计数器设置为60并绘制对象直到计数器达到0。

这样可以,但不是很好。例如,它很难写出类似的东西 drawObjectFor(object, time)因为该对象有时与主循环“相距很远”。有没有更好的方法呢?

2 个答案:

答案 0 :(得分:5)

你的FPS可能(并且通常会)变化,因此计算帧数不是一个好主意。

假设这个例子看看这会如何咬你:
您的应用程序运行速度为60 FPS,帧时间为16.58ms。这意味着将对象放在屏幕上2秒钟,您将需要绘制120帧的对象。很简单,我们走吧! 绘制对象增加0.1 ms,总帧时间为16.68ms。哦sh * t。现在你有30 FPS,你的对象显示4秒......

使用适当的时间来决定是否绘制对象。当你得出你的对象的时间已经结束的结论时,只需设置一个标志,这样你就不会绘制它(或者,如果你有一个,或者删除它,或者删除它,或者将其从场景图中删除)。

这可以通过多种方式完成:

  • 在Windows下
    • 使用SetTimer,它会将消息发布到您窗口的消息队列中。收到WM_TIMER通知时,将对象的do_draw标志(或任何您想要调用的标志)设置为false。
    • 如果您已经在每个帧的某个地方使用WaitFor(Single|Multiple)Object,请执行CreateWaitableTimer,并等待此操作。您可以使用MsgWaitForMultipleObjectsEx进行消息抽取和一次等待,并同时检查APC。
    • 没有什么能阻止您每帧手动阅读一次。 GetTickCount一次,添加2000,并执行if(new_count <= old_count + 2000) draw_object()。虽然GetTickCount的准确性很差(几十毫秒),但等待2秒时这根本不重要。
  • 在Linux下
    • 使用timerfdepoll检查准备情况,或将timerfd设置为非阻止,并查看是否从中读取EAGAIN
    • 使用clock_gettime并手动执行(与GetTickCount一样)
    • 使用setitimer

答案 1 :(得分:1)

您可以在对象本身中拥有一个“生存时间”字段,该字段将向下计数,直到该对象被销毁(或至少变为不可见)。

然后drawObjectFor(object, time)会设置object.timeToLive = time。然后,您还需要将帧时间传递给对象,可能是在渲染时,因此可以相应地减少它timeToLive