Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SDL图像撕裂/口吃_C++_Image_Sdl_Double Buffering - Fatal编程技术网

C++ SDL图像撕裂/口吃

C++ SDL图像撕裂/口吃,c++,image,sdl,double-buffering,C++,Image,Sdl,Double Buffering,首先,让我澄清一些事情: 我的显示器的频率是60赫兹 我的FPS上限为60,它似乎工作正常 我激活了双缓冲标志 我自己做了一个后缓冲,并确保画到它,然后到屏幕上 此问题在全屏模式和窗口模式下都会发生 这是我的主要功能(它包含所有代码): SDL_Init(SDL_Init_EVERYTHING); SDL_表面*backbuffer=NULL; SDL_表面*屏幕=空; SDL_曲面*框=空; SDL_表面*背景=空; SDL_Rect*Rect=新的SDL_Rect(); 双FPS=60; 下

首先,让我澄清一些事情:

  • 我的显示器的频率是60赫兹
  • 我的FPS上限为60,它似乎工作正常
  • 我激活了双缓冲标志
  • 我自己做了一个后缓冲,并确保画到它,然后到屏幕上
  • 此问题在全屏模式和窗口模式下都会发生
  • 这是我的主要功能(它包含所有代码):

    SDL_Init(SDL_Init_EVERYTHING);
    SDL_表面*backbuffer=NULL;
    SDL_表面*屏幕=空;
    SDL_曲面*框=空;
    SDL_表面*背景=空;
    SDL_Rect*Rect=新的SDL_Rect();
    双FPS=60;
    下次加倍;
    布尔值=假;
    rect->x=0;
    rect->y=0;
    屏幕=SDL_设置视频模式(1920、1080、32、SDL_表面| SDL_双屏| SDL_全屏);
    如果(屏幕==NULL){
    返回0;
    }
    background=SDL_LoadBMP(“background.bmp”);
    box=SDL_LoadBMP(“box.bmp”);
    如果((背景==NULL)| |(框==NULL)){
    返回0;
    }
    背景=SDL_显示格式(背景);
    box=SDL_显示格式(box);
    backbuffer=SDL_CreateRGB曲面(SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_全屏,
    1920,
    1080,
    32,
    0,
    0,
    0,
    0);
    if(backbuffer==NULL){
    返回0;
    }
    下一次=(双精度)SDL_GetTicks()+(1000.0/FPS);
    while(true){
    如果(!绘制){
    SDL_BlitSurface(背景,空,backbuffer,空);
    SDL_BlitSurface(框、空、backbuffer、rect);
    rect->x+=3;
    绘制=真;
    }
    如果(Uint32)下次

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

    SDL_putenv("SDL_VIDEODRIVER=directx");
    
    感谢您的评论,他们帮助我找到了解决方案。:D


    我想我也应该检查一下SDL2.0…

    如何将帧速率限制在60?@Raxvan它在源代码中…实际上我现在可以看到,当您取消fps限制时,您得到的帧速率是多少?我很感兴趣,因为我的答案将基于结果:)你怎么知道你请求的视频标志被实际使用了?取消上限时为200-400 FPS,因此它可能不会等待SDL_Flip上的屏幕刷新,我也不知道这些标志是否被实际使用。请注意,这并不能保证每个系统上都有HW_表面。如果你想要真正的硬件控制,请使用opengl。
    SDL_putenv("SDL_VIDEODRIVER=directx");