在OpenGL中绘制X秒的对象

seb*_*seb 2 opengl

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

这样可以,但不是很好.例如,drawObjectFor(object, time)由于对象有时"远离"主循环,因此很难编写类似 的内容.有没有更好的方法呢?

Dam*_*mon 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下
    • 使用a timerfd和a epoll检查准备情况,或将timerfd其设置为非阻止,并查看是否从中读取返回EAGAIN
    • 使用clock_gettime并手动完成(如同GetTickCount)
    • 使用 setitimer