C ++在执行操作之前等待一帧

时间:2011-05-18 23:05:50

标签: c++ opengl frame

你会如何在c ++中等待一个帧。

我不希望程序睡觉或任何东西。

它会像

那样

在此框架中执行此操作(1)

继续其余的计划

在下一帧(2)中执行此操作

其中,动作1仅在第一帧中发生,动作2仅在下一帧中发生。它会像这样继续下去。 1,2,1再次,2

我有帧之间的时间,我使用c ++,我正在使用Visual Studio 2008进行编译。

编辑:

我正在使用Opengl我的操作系统是Windows 7。

框架 - http://en.wikipedia.org/wiki/Frame_rate 比如在给定时间段内打印到屏幕的场景的每个图像

2 个答案:

答案 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就不必在工作线程和渲染器线程之间切换上下文。