我正在学习 SDL2 的基础知识,当我运行我的程序(vsync,窗口化)时,在窗口之间切换焦点和拖动窗口时会有延迟。这适用于所有窗口,而不仅仅是 SDL2 应用程序。未启用 vsync 时,所有窗口都按预期流畅运行。
我正在运行 ubuntu 14.04,使用 nvidia 卡,驱动程序版本 349.12。下面是在我的机器上重现该行为的最小工作示例。
#include <SDL2/SDL.h>
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
SDL_Window* gWindow = NULL;
SDL_Renderer* gRenderer = NULL;
void init(bool vsync);
int main(int argc, char* args[]) {
init(true);
bool quit = false;
SDL_Event e;
while (!quit) {
while (SDL_PollEvent(&e) != 0) {
if (e.type == SDL_QUIT) {
quit = true;
}
}
SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(gRenderer);
SDL_Rect fillRect = {SCREEN_WIDTH/4, SCREEN_HEIGHT/4, SCREEN_WIDTH/2, SCREEN_HEIGHT/2};
SDL_SetRenderDrawColor(gRenderer, 0xFF, 0x00, 0x00, 0xFF); //RGBA
SDL_RenderFillRect(gRenderer, &fillRect);
SDL_RenderPresent(gRenderer);
}
SDL_DestroyRenderer(gRenderer);
gRenderer = NULL;
SDL_DestroyWindow(gWindow);
gWindow = NULL;
SDL_Quit();
return 0;
}
void init(bool vsync) {
SDL_Init(SDL_INIT_VIDEO);
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");
gWindow = SDL_CreateWindow("SDL test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (vsync) {
gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
} else {
gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED);
}
}
在第二台机器(14.04,bumblebee 驱动程序)上运行此代码会产生平滑的窗口行为,无论是否使用 vsync。我还尝试了许多有和没有 vsync 的游戏,唯一能重现这种行为的是 FTL(我相信这是一款 SDL 游戏)。
如何进一步修复/调试?