2013-12-17 69 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