1

我正在学习 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 游戏)。

如何进一步修复/调试?

4

0 回答 0