你会如何在c ++中等待一个帧。
我不希望程序睡觉或任何东西。
它会像
那样在此框架中执行此操作(1)
继续其余的计划
在下一帧(2)中执行此操作
其中,动作1仅在第一帧中发生,动作2仅在下一帧中发生。它会像这样继续下去。 1,2,1再次,2
我有帧之间的时间,我使用c ++,我正在使用Visual Studio 2008进行编译。
编辑:
我正在使用Opengl我的操作系统是Windows 7。
框架 - http://en.wikipedia.org/wiki/Frame_rate 比如在给定时间段内打印到屏幕的场景的每个图像
答案 0 :(得分:0)
我在这里做了一些假设。
假设您有一个希望显示状态的模型。您可能希望最大化用于演化模型而不是渲染的CPU时间。
因此,您可以修复目标帧速率,例如25 fps。
同样,假设您已经优化了渲染,因此可以在不到0.04秒的时间内完成渲染。
所以你可能需要类似(伪代码)的东西:
Time lastRendertime = now();
while(forever)
{
Time current = now();
if ((current - lastRenderTime > 0.04))
{
renderEverything();
lastRenderTime = current;
}
else
{
evolveModelABit();
}
}
当然,你可能有一个输入处理程序来打破循环。请注意,此方法假定您不希望模型演变受实际时间的影响。如果您这样做,可能会有游戏,那么请将current
时间传递给evolveModelABit();
。
对于Windows上的时间函数,您可以使用:
LARGE_INTEGER frequency; // ticks per second
LARGE_INTEGER t1; // ticks
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&t1);
请注意,此方法适用于科学类型模拟。模型演化不依赖于帧速率,渲染等,并且给出了相同的结果。
对于游戏,通常会推动最大化fps。这意味着主循环的形式为:
Time lastRendertime = now();
while(forever)
{
Time current = now();
evolveModelABit(current, lastRenderTime);
renderEverything();
lastRenderTime = current;
}
答案 1 :(得分:0)
如果启用了V-Sync, SwapBuffers 将阻止当前线程,直到显示下一帧。因此,如果您在调用 SwapBuffers 之前创建工作线程并释放锁定或恢复其执行,您的程序将获得CPU时间,否则它将在等待期间产生系统的其余部分 - for-swap块。如果工作线程正在操作GPU资源,最好使用高分辨率/性能计数器来确定交换之前剩余的时间,减去一些余量并在工作线程中使用此时间,以便工作线程自行调整大约在交换发生的时候睡觉,这样GPU就不必在工作线程和渲染器线程之间切换上下文。