2013-06-15 3 views
1

저는 최신 CPU (AMD FX 4170)와 최신 GPU (NVidia GTX 660)를 보유하고 있습니다. 그러나이 간단한 프로그램은 내 CPU 코어 중 하나를 완전히 사용합니다. 즉, 하나의 4.2GHz 코어를 사용하여 을 입력하지 마십시오.은 60FPS입니다. 이 프로그램에 어떤 문제가 있습니까?SDL + OpenGL에서 높은 CPU 사용량

#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; 
} 

답변

3

그것은 NVIDIA의 드라이버 'VSYNC를 기다리는 구현하는 것이 밝혀 모든 CPU를 사용하지 않도록 제안한다 SDL_GL_SwapBuffers()가 100 % CPU를 사용하도록하는 바쁜 루프가 있습니다. NVidia 제어판에서 vsync를 끄면이 문제가 해결됩니다.

2

루프는 가능한 한 많은 컴퓨팅 성능을 사용합니다. 당신의 작업을 기다리지 않고 그냥 무한 루프가 될 수 있도록 제로보다 작은 수있다

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

당신의 지연 기간 : 가장 큰 문제는에있을 수 있습니다. 변수 delay의 값을 제어해야합니다.

또한,이 link에 : VSYNC를 활성화하는 데 사용할 수 있습니다

SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,1);

+0

그러나 나머지 루프가 1/60 초가 걸릴 때만 해당됩니까? 현대 시스템에서 오래 걸리지 않아야합니다. – Scintillo

+0

@Scintillo, 그 방법이 15 밀리 초 이상 걸리면,이 상황이 발생합니다. std :: cout << delay << std :: endl; ? –

+0

실제로 SDL_GL_SwapBuffers(); 그 시간을 사용합니다. 질문이 그 이유입니까? 그것은 vsync를 기다리고있을 수 있지만 그것을하는 동안 전체 CPU를 사용해야하는 이유는 무엇입니까? – Scintillo