Высокая загрузка ЦП с SDL + OpenGL

У меня современный процессор (AMD FX 4170) и современный GPU (NVidia GTX 660). И все же этой простой программе удается полностью использовать одно из ядер моего процессора. Это означает, что он использует одно ядро ​​4,2 ГГц, чтобы ничего не рисовать при 60 FPS. Что не так с этой программой?

#include <SDL/SDL.h>

int main(int argc, char** argv)
{
    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
    SDL_SetVideoMode(800, 600, 0, SDL_OPENGL | SDL_RESIZABLE);

    while(true)
    {
        Uint32 now = SDL_GetTicks();
        SDL_GL_SwapBuffers();

        int delay = 1000 / 60 - (SDL_GetTicks() - now);
        if(delay > 0) SDL_Delay(delay);
    }

    return 0;
}

2 ответа

Решение

Оказывается, что драйверы NVidia реализуют ожидание vsync с занятым циклом, который заставляет SDL_GL_SwapBuffers() использовать 100 % CPU. Отключение vsync из панели управления NVidia устраняет эту проблему.

Циклы используют столько вычислительной мощности, сколько могут. Основная проблема может быть расположена в:

int delay = 1000 / 60 - (SDL_GetTicks() - now);

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

Более того, в этой ссылке: предлагается

SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,1); можно использовать для включения vsync, чтобы он не использовал весь процессор

Другие вопросы по тегам