C++;在执行操作之前等待一帧 你如何等待C++中的框架?
我不想让程序睡眠或其他任何事情 事情会发展得很顺利 在该框架中执行此操作(1) 继续程序的其余部分 在下一帧(2)中执行此操作 其中,动作1仅在第一帧中发生,动作2仅在下一帧中发生。它将继续这样下去。一,二,一,二 <>我有帧间的时间,我使用C++,我使用Visual Studio 2008编译。 编辑: 我使用的是Opengl,我的操作系统是Windows7 框架-C++;在执行操作之前等待一帧 你如何等待C++中的框架?,c++,opengl,frame,C++,Opengl,Frame,我不想让程序睡眠或其他任何事情 事情会发展得很顺利 在该框架中执行此操作(1) 继续程序的其余部分 在下一帧(2)中执行此操作 其中,动作1仅在第一帧中发生,动作2仅在下一帧中发生。它将继续这样下去。一,二,一,二 我有帧间的时间,我使用C++,我使用Visual Studio 2008编译。 编辑: 我使用的是Opengl,我的操作系统是Windows7 框架- 就像在给定时间段内打印到屏幕上的每个场景图像一样,我在这里做一些假设 假设您有一个要显示其状态的模型。您可能希望最大限度地利用演化模
就像在给定时间段内打印到屏幕上的每个场景图像一样,我在这里做一些假设 假设您有一个要显示其状态的模型。您可能希望最大限度地利用演化模型而不是渲染所花费的CPU时间 因此,将目标帧速率固定为25 fps 同样,假设您已经优化了渲染,以便可以在不到0.04秒的时间内完成渲染 因此,您可能需要(伪代码): 当然,您可能有一个输入处理程序来中断循环。请注意,此方法假定您不希望模型演化受到已用实时的影响。如果您这样做了,并且游戏可能会这样做,那么将
当前
时间传递给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;
}
如果启用V-Sync,SwapBuffers将阻止当前线程,直到显示下一帧。因此,如果在SwapBuffers调用之前创建一个工作线程,并释放一个锁,或恢复其执行,那么您的程序将收到CPU时间,否则它将在等待交换块期间让渡给系统的其余部分。如果工作线程正在操作GPU资源,最好使用高分辨率/性能计数器来确定距离交换还剩多少时间,减去一些余量,并在工作线程中使用此计时,以便工作线程在交换发生时将自己置于睡眠状态,这样GPU就不必在工作线程和渲染线程之间切换上下文。什么是帧?窗口?您希望程序在此期间执行什么操作?您使用的是什么操作系统和窗口系统/工具包?还是你在使用OpenGL或DirectX?@code我认为这是一个动画框架正如Jason所说,要回答这个问题,你必须提供你正在使用的操作系统和图形库。谢谢,这实际上为我打开了一个全新的话题。但我最初想知道的是,如何在下一帧之前对GPU的遮挡查询结果进行轮询。
Time lastRendertime = now();
while(forever)
{
Time current = now();
evolveModelABit(current, lastRenderTime);
renderEverything();
lastRenderTime = current;
}