SDL_RENDERER_PRESENTVSYNC不一致显示

时间:2015-09-10 11:20:06

标签: c++ sdl-2

我最近决定使用SDL作为我的库之一来编写一个C ++游戏。在我的程序编写和学习SDL的过程中,我偶然发现了程序中的一个特殊错误,并决定在SSCCE中复制它以确保我没有疯狂。

问题似乎是当我将SDL_RENDERER_PRESENTVSYNC作为标志传递给SDL_CreateRenderer时,我得到了不一致的渲染。为了比较,我运行程序50次,没有标志50次,并且在每种情况下对我的程序进行了唯一的更改。没有标志,显示器100%的工作时间。打开标志后,它只会在50次中成功渲染13次。

以下是该计划:

#include <SDL2/SDL.h>
#include <iostream>

int main(int argc, char** argv)
{
    if(SDL_Init(SDL_INIT_VIDEO) != 0)
    {
        std::cerr << "Unable to initialize SDL: " << SDL_GetError() << std::endl;
        return -1;
    }
    SDL_Window* win = SDL_CreateWindow("Testing", 
                                       SDL_WINDOWPOS_UNDEFINED, 
                                       SDL_WINDOWPOS_UNDEFINED,
                                       640, 480, SDL_WINDOW_SHOWN);
    SDL_Renderer* renderer = SDL_CreateRenderer(win, -1, 
                                                SDL_RENDERER_ACCELERATED | 
                                                SDL_RENDERER_PRESENTVSYNC);
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    SDL_RenderClear(renderer);
    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
    for(int x = 0; x < 640; x+=32)
    {
        for(int y = 0; y < 480; y+=32)
        {
            SDL_Rect rect = {x+1, y+1, 31, 31};
            SDL_RenderFillRect(renderer, &rect);
        }
    }
    SDL_RenderPresent(renderer);
    SDL_Delay(500);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

如果它有所不同,我正在编译和测试Ubuntu 15.04,GCC / G ++ 4.9.2上的程序,编译并链接到SDL 2.0.2。

对于SDL来说是新手,对C ++和C来说还是比较新的(我来自Java背景),我认为我很可能犯了一个我没有抓到的简单错误,但我可以想想我可能会做的事情。

1 个答案:

答案 0 :(得分:1)

对于那些在未来看到这个问题的人来说,这个问题似乎已经在一年多之后解决了,因为我再也无法复制自己的SSCCE了。这可能是环境的变化,因为我没有使用相同的系统,现在使用的是Nvidia显卡。虽然我无法再对此进行验证,但问题几乎肯定存在于环境或硬件中。同样的笔记本电脑最终在一两个月之后就失败了(主板问题),所以请从那里拿出你的意思。如果您遇到同样的问题,请考虑检查您的硬件运行状况并尝试完全干净的环境。