Предоставление процессору отдыха после рендеринга сцены - PullRequest
2 голосов
/ 18 января 2012

Я читал, что хорошей идеей является дать 3D-программу, в которой рендеринг включает в себя отдых между рендерингом.Это правда?Это уменьшит нагрузку на процессор или это не связано?

Если да, то какой метод вы порекомендуете?Кроме того, имеет ли это какое-либо отношение к ограничению частоты кадров, то есть ограничению при 60 кадрах в секунду, и, если не время для рендеринга другого кадра, отдохните и подождите, пока нам не понадобится сделать другой кадр, чтобы соответствовать отметке 60 кадров в секунду.

IЯ использую OpenGL и C ++.

Ответы [ 6 ]

5 голосов
/ 18 января 2012

Да, ограничение частоты кадров снижает нагрузку на процессор.

Кроме того, если у вас 2000 кадров в секунду, ваш монитор не будет отображать каждый кадр, обычно только 60 кадров в секунду. http://en.wikipedia.org/wiki/Refresh_rate

Я рекомендую следующий метод (код, использующий время повышения даты и библиотеку потоков):

#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

long desiredFps=60;

void drawLoop() {
    using namespace boost;
    using namespace boost::posix_time;

    ptime lastDraw = microsec_clock::universal_time();
    while( true ) {
        ptime now = microsec_clock::universal_time();
        long diff = (now-lastDraw).total_microseconds();
        long desiredDiff = 1000000/desiredFps;
        if( diff < desiredDiff ) {
            this_thread::sleep(microseconds(desiredDiff-diff));
        }
        draw();
        lastDraw = now;
    }
}
3 голосов
/ 18 января 2012

Для простых сцен это может быть хорошей идеей.В противном случае вы воспроизводите сцену со скоростью 2000 кадров в секунду, и вы действительно никогда не получите более быстрый, чем 120 Гц или 60 Гц, к экрану, поэтому эти сцены будут потрачены впустую.Такая низкая загрузка ЦП хороша, когда у вас есть другие приложения, которые вы хотите запустить.Если вы запускаете игру, предназначенную для использования только в одном случае, запустите ее на полнопроходной без такого регулирования.

1 голос
/ 18 января 2012

Я не слышал, чтобы ожидание останова ЦП помогало повысить производительность.Однако тот же эффект уже должен происходить.OpenGL должен отдыхать процессор между обновлениями кадров, так что это не должно быть проблемой в теории.Возможно, идея «процессорного покоя» возникла из фреймворков, которые не выполняют цикл обработки событий для фрейма.Я буду смотреть на эту ветку, если есть другая точка зрения на это.

0 голосов
/ 29 мая 2012

Движки игры должны быть многопоточными, и каждый поток должен работать с отдельным объектом кадрового буфера, включая метод двойной / тройной буферизации (это обязательно). Вызовы glFinish () не приведут к потоку, но вызов (glX)SwapBuffers () будет выполняться, когда больше нет доступного буфера для операции рисования, автоматически уменьшая использование процессора до оптимальной точки. Почти все реализации GL настроены для этого.

0 голосов
/ 12 февраля 2012

В системах с общей (унифицированной) памятью GPU, таких как младшие ПК и большинство смартфонов, CPU и GPU конкурируют друг с другом за пропускную способность памяти. Выполнение дополнительных вычислений, связанных с большим количеством обращений к памяти, будет мешать чтению текстур и обновлению кадрового буфера, что приведет к снижению частоты кадров.

0 голосов
/ 18 января 2012

У меня был компьютер Gateway, который был в порядке, пока я не начал делать рендеринг графики.Вскоре после этого процессор заработал.

Но это был недостаток компьютера, вам не нужно об этом беспокоиться.

...