SDL图像撕裂/口吃

时间:2013-12-17 16:38:44

标签: c++ image sdl double-buffering

首先,让我说清楚一些事情:

  1. 我的显示器是60赫兹
  2. 我将我的FPS限制为60,它似乎正常工作
  3. 我有双缓冲标志激活
  4. 我自己制作了一个后备缓冲器,并确保绘制它,然后再进入屏幕
  5. 在全屏和窗口模式下都会出现此问题
  6. 这是我的主要功能(它包含所有代码):

    SDL_Init(SDL_INIT_EVERYTHING);
    
    SDL_Surface * backbuffer = NULL;
    SDL_Surface * screen = NULL;
    SDL_Surface * box = NULL;
    SDL_Surface * background = NULL;
    
    SDL_Rect * rect = new SDL_Rect();
    
    double FPS = 60;
    double next_time;
    bool drawn = false;
    
    rect->x = 0;
    rect->y = 0;
    
    screen = SDL_SetVideoMode(1920, 1080, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
    if(screen == NULL) {
        return 0;
    }
    background = SDL_LoadBMP("background.bmp");
    box = SDL_LoadBMP("box.bmp");
    if((background == NULL) || (box == NULL)) {
        return 0;
    }
    
    background = SDL_DisplayFormat(background);
    box = SDL_DisplayFormat(box);
    
    backbuffer = SDL_CreateRGBSurface(SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN,
        1920,
        1080,
        32,
        0,
        0,
        0,
        0);
    
    if(backbuffer == NULL) {
        return 0;
    }
    next_time = (double)SDL_GetTicks() + (1000.0 / FPS);
    while(true) {
        if(!drawn) {
            SDL_BlitSurface(background, NULL, backbuffer, NULL);
            SDL_BlitSurface(box, NULL, backbuffer, rect);
            rect->x += 3;
            drawn = true;
        }
        if((Uint32)next_time <= SDL_GetTicks()) {
            SDL_BlitSurface(backbuffer, NULL, screen, NULL);
            SDL_Flip(screen);
            next_time += 1000.0 / FPS;
            drawn = false;
        }
    }
    
    SDL_FreeSurface(backbuffer);
    SDL_FreeSurface(background);
    SDL_FreeSurface(box);
    SDL_FreeSurface(screen);
    SDL_Quit();
    return 0;
    

    我知道这段代码看起来不太好,这只是一个测试,看看为什么每当我在SDL中写任何东西时都会发生这种情况。

    请忽略丑陋的代码,如果您知道可能导致黑色背景上移动的白色方块的图像有什么奇怪的伪像并且看起来像是撕裂/口吃,请告诉我。

    如果您需要更多信息,请通知我,我会更新所需内容。

    编辑:

    • 如果我没有限制我的FPS,它的运行速度为200-400 fps,这可能意味着SDL_Flip没有等待屏幕刷新。

    • 我不知道我写的标志是否实际使用过。

    • 我检查了我的标志,看起来我无法获得SDL_HWSURFACE和SDL_DOUBLEBUF标志。它可能会导致问题吗?

1 个答案:

答案 0 :(得分:1)

SDL Double buffering on HW_SURFACE

这是我的问题的解决方案。 我所要做的就是添加这一行:

SDL_putenv("SDL_VIDEODRIVER=directx");

感谢您的评论,他们帮助我找到了解决方案。 :d

我想我也应该检查SDL 2.0 ......