在OpenGL中,一切都适用于主循环(据我所知)。如果要在给定时间内绘制对象,则会出现此问题。现在,我做的是:我测量应用程序的近似FPS并设置一个计数器,我在主循环的每次迭代中减少。当计数器达到0时,我停止绘图。因此,例如,如果我想在屏幕上绘制一个2s的对象,并且我的FPS是30,我将计数器设置为60并绘制对象直到计数器达到0。
这样可以,但不是很好。例如,它很难写出类似的东西
drawObjectFor(object, time)
因为该对象有时与主循环“相距很远”。有没有更好的方法呢?
答案 0 :(得分:5)
你的FPS可能(并且通常会)变化,因此计算帧数不是一个好主意。
假设这个例子看看这会如何咬你:
您的应用程序运行速度为60 FPS,帧时间为16.58ms。这意味着将对象放在屏幕上2秒钟,您将需要绘制120帧的对象。很简单,我们走吧!
绘制对象增加0.1 ms,总帧时间为16.68ms。哦sh * t。现在你有30 FPS,你的对象显示4秒......
使用适当的时间来决定是否绘制对象。当你得出你的对象的时间已经结束的结论时,只需设置一个标志,这样你就不会绘制它(或者,如果你有一个,或者删除它,或者删除它,或者将其从场景图中删除)。
这可以通过多种方式完成:
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秒时这根本不重要。timerfd
和epoll
检查准备情况,或将timerfd
设置为非阻止,并查看是否从中读取EAGAIN clock_gettime
并手动执行(与GetTickCount
一样)setitimer
答案 1 :(得分:1)
您可以在对象本身中拥有一个“生存时间”字段,该字段将向下计数,直到该对象被销毁(或至少变为不可见)。
然后drawObjectFor(object, time)
会设置object.timeToLive = time
。然后,您还需要将帧时间传递给对象,可能是在渲染时,因此可以相应地减少它timeToLive
。