Ubuntu 14.04 Задержка при переключении фокуса окна с использованием SDL2 и vsync
Я изучаю основы SDL2, и когда я запускаю свою программу (vsync, windowed), возникает задержка, когда переключение фокуса между окнами и перетаскивание окон запаздывает. Это относится ко всем окнам, а не только к приложению 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, драйверы шмеля) приводит к плавному поведению окон как с vsync, так и без него. Я также пробовал множество игр с и без vsync, и единственная, которая воспроизводит поведение, это FTL (я считаю, что это игра SDL).
Как я могу исправить это / отладить дальше?