C ++ ожидание кадра перед выполнением действия - PullRequest
1 голос
/ 19 мая 2011

Как бы вы ожидали фрейм в c ++.

Я не хочу, чтобы программа спала или что-то в этом роде.

Это будет выглядеть как

Сделайте это вэтот кадр (1)

Продолжить с остальной частью программы

Сделайте это в следующем кадре (2)

, где действие 1 происходит только в первом кадре, а действие 2 происходиттолько в следующем кадре.Это будет продолжаться, как это.1, 2, 1 снова, 2

У меня есть время между кадрами, я использую c ++, и я использую Visual Studio 2008 для компиляции.

Редактировать:

IИспользую Opengl, моя ОС - Windows 7.

Frame - http://en.wikipedia.org/wiki/Frame_rate, как и каждое изображение сцены, напечатанное на экране в течение заданного периода времени

Ответы [ 2 ]

0 голосов
/ 19 мая 2011

Если V-Sync включен, SwapBuffers будет блокировать текущий поток, пока не будет показан следующий кадр.Поэтому, если вы создаете рабочий поток и освобождаете блокировку или возобновляете его выполнение непосредственно перед вызовом SwapBuffers , ваша программа получает время ЦП, которое в противном случае было бы отдано остальной системе во время ожиданияпоменять блок.Если рабочий поток манипулирует ресурсами графического процессора, рекомендуется использовать высокие счетчики разрешения / производительности, чтобы определить, сколько времени осталось до замены, минус некоторый запас и использовать это время в рабочем потоке, чтобы рабочий поток помещал себяспать примерно в то время, когда происходит перестановка, так что графическому процессору не придется переключать контекст между рабочим потоком и потоком рендерера.

0 голосов
/ 19 мая 2011

Я делаю некоторые предположения здесь.

Предположим, у вас есть модель, для которой вы хотите показать состояние.Возможно, вы захотите максимизировать время, затрачиваемое процессором на разработку модели, а не на рендеринг.

Таким образом, вы фиксируете целевую частоту кадров, например, 25 кадров в секунду.

Опять же, предположим, что вы оптимизировали рендеринг так, чтобыэто можно сделать менее чем за 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...