当我像这样编写我的SDL2 OpenGL程序时(使用VSync):
SDL_GL_SetSwapInterval(1);
while(isRunning)
{
while(SDL_PollEvent(&e))
{
if(e.type == SDL_Quit)
{
isRunning = false;
}
}
SDL_GL_SwapWindow(window);
}
这个单个程序的CPU使用率高达39%-50%,实际上什么都不做
而当我计算时差到SDL_Delay()
后我通过睡眠时间会使我的编程完全冻结,并且“没有响应”。
我不想使用SDL_WaitEvent()
因为我的程序会显示无论输入事件如何都会运行的动画。
是否有任何等同于pygame的既不阻止输入也不阻止视频线程
fpsClock = pygame.time.Clock()
while(True):
pygame.display.update()
fpsClock.tick(60)
答案 0 :(得分:2)
您是否检查过SDL_GL_SetSwapInterval(1)
的来电是否成功?如果您的通话成功,您的FPS应该以您的刷新率为上限。
您是否在SDL中正确初始化了OpenGL以实现双缓冲?像这样for exmaple:
SDL_Window *window;
SDL_GLContext context;
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
window = SDL_CreateWindow("OpenGL Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_OPENGL);
if (!window) {
fprintf(stderr, "Couldn't create window: %s\n", SDL_GetError());
return;
}
context = SDL_GL_CreateContext(window);
if (!context) {
fprintf(stderr, "Couldn't create context: %s\n", SDL_GetError());
return;
}
int r, g, b;
SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &r);
SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &g);
SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &b);
printf("Red size: %d, Green size: %d, Blue size: %d\n", r, g, b);
SDL不是框架,没有帧速率控制这样的高级功能。但是你应该有VSync的帧率上限。如果没有封顶,则可能意味着VSync无法正常工作。
请考虑查看有关如何在SDL中设置OpenGL应用的更深入的教程,this for example,see also。