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

标签 c++ opengl frame

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

我不希望程序休眠或发生任何事情。

它会变成这样

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

继续程序的其余部分

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

其中 Action 1 仅在第一帧发生, Action 2 仅在下一帧发生。它会一直这样下去。 1, 2, 1 又是 2

我在帧之间有时间,我使用 C++ 并使用 Visual Studio 2008 进行编译。

编辑:

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

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

最佳答案

我在这里做了一些假设。

假设您有一个模型,您希望显示其状态。您可能希望最大限度地利用 CPU 时间来改进模型而不是渲染。

所以你固定目标帧率,例如25 帧/秒。

同样,假设您已经优化了渲染,因此可以在不到 0.04 秒的时间内完成。

所以你可能想要类似(伪代码)的东西:

Time lastRendertime = now();
while(forever)
{
    Time current = now();
    if ((current - lastRenderTime > 0.04))
    {
        renderEverything();
        lastRenderTime = current;
    } 
    else
    {
        evolveModelABit();  
    }
}

当然,您可能有一个输入处理程序来打破循环。请注意,此方法假设您不希望模型演化受实时流逝的影响。如果您这样做,而且游戏可能会这样做,则将当前时间传递给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;
}

关于C++ 在执行操作之前等待一帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6052026/

相关文章:

c# - Sprite/Texture Atlas : GDI+ Bitmap. MakeTransparent for color-key 与 OpenTK

Java 视频播放器

Java GUI 更改 'tile' 的位置

c++ - 模板类运算符重载多个类型名 C++

C++ 我需要重载哪些运算符才能使这个 A1 += A2 * floatValue 工作?

c++ - 在 Qt 中将 T 的集合转换为 QVariant 的集合

ios - 为什么我不能更改 UILabel 的框架?

c++ - 贝尔曼福特实现 C++

java - LWJGL 使用 PBO 读取像素失败

c++ - 将 wxwidgets opengl 应用程序移植到不依赖库的应用程序