2013-10-03 28 views
0

我想改變我的應用程序與窗口的大小:是否可以vsync SDL_SetVideoMode?

mysurface = SDL_SetVideoMode(width, height, 32, SDL_OPENGL); 

雖然我使用VSYNC swapbuffers(在駕駛員的xorg-視頻-ATI),我可以看到閃爍的窗口大小改變時(我想一個或多個黑幀):

void Video::draw() 
{ 
    if (videoChanged){ 
     mysurface = SDL_SetVideoMode(width, height, 32, SDL_OPENGL); 
     scene->init(); //Update glFrustum & glViewPort 
    } 
    scene->draw(); 
    SDL_GL_SwapBuffers(); 
} 

所以,請有人知道,如果...
的SDL_SetVideoMode不vsync'ed爲是SDL_GL_SwapBuffers()?
或者是破壞窗口並創建另一個緩衝區是黑色的?
有人知道一個工作代碼來做到這一點?也許在freeglut中?

回答

2

在SDL-1中,當您使用窗口化視頻模式時,窗口將完全拆除,並在更改視頻模式時創建新窗口。當然,中間存在一些未定義的數據,這被認爲是閃爍的。 SDL-2解決了這個問題。要麼使用它,要麼使用不同的OpenGL框架,它可以調整窗口大小而不用完整的窗口重新創建。


如果您使用的是FULLSCREEN視頻模式,然後不同的東西發生了另外:

視頻模式的改變實際上改變了視頻信號的定時從顯卡到顯示器去。在這樣的改變之後,顯示器必須找到與新設置的同步並且需要一些時間。這當然會伴隨着閃爍,因爲顯示器可能會嘗試顯示與舊設置不同的時間幀,直到它檢測到不再匹配爲止。這是一種物理效應,除了不改變視頻模式之外,您無法在軟件中進行修復。

+0

我試過SDL2並且閃爍仍然存在......但我現在認爲閃爍是Xorg功能還是radeon功能......我查找了glxgears源代碼,並且在發生調整大小時立即執行重繪...所以fps保持vsync'ed,但閃爍發生,我不能理解...... :( –

+0

也許這是導致許多程序,包括我的閃爍:background-pixmap - >「服務器自動瓷磚區域與窗口的背景除非窗口背景爲無「 –

+0

我將背景像素從glxgears和chaged background pixmap中刪除爲None。現在glxgears沒有閃爍,但是我的SDL窗口仍然有,如果我可以禁用它,我會問另一個問題。非常感謝你! –