2013-12-17 70 views
0

首先,让我做一些事情说清楚:SDL图像撕裂/口吃

  1. 我的显示器是60赫兹
  2. 我盖我的FPS至60,似乎一切正常
  3. 我有双缓冲标志活跃
  4. 我做了一个后备缓冲自己,并确保提请它,事后屏幕
  5. 这个问题无论是在全屏和窗口模式发生

这是我的主要功能(它包含了所有的代码):

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标志。这可能会导致问题?

+0

如何将你的帧速率限制到60? – Raxvan

+0

@Raxvan它在源代码中... –

+1

实际上,我现在可以看到它,当你删除fps限制时,你得到的帧速率是多少?我很感兴趣,因为我的答案将基于结果:) – Raxvan

回答

1

SDL Double buffering on HW_SURFACE

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

SDL_putenv("SDL_VIDEODRIVER=directx"); 

感谢您的意见,他们帮我找到了解决办法。 :D

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

+0

请注意,这并不能保证每个系统上都有HW_SURFACE。如果你想要真正的硬件控制使用opengl。 – this