2012-04-29 50 views
0

我與SDL_SetVideoMode忽略標誌和SDL_Flip緩慢

SDL_Init(SDL_INIT_VIDEO); 
screen = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE|SDL_DOUBLEBUF); 

,然後初始化調用,在一個循環中,調用之間睡覺,只是

SDL_LockSurface(screen); 
// Will eventually twiddle pixels here...but not yet 
SDL_UnlockSurface(screen); 
SDL_Flip(screen); 

該調用翻轉需要時間長短不一,但是大約需要10毫秒,這是很不容易的。

因此,這讓我想知道是否導致了從視頻內存到系統內存的拷貝等問題,我應該創建不同的表面。但是,另外,screen->flags總是等於SDL_ASYNCBLIT,並且不管其他位如何設置,無論我傳遞給SDL_SetVideoMode的標誌如何。所以我無論如何都無法做出任何其他類型的表面。

我是否應該創建另一個離屏表面,渲染到該位置,然後將其傳送到屏幕?我究竟做錯了什麼?

編輯:刪除SDL_Lock和SDL_Unlock對沒有任何東西來加快速度。 SDL_Flip速度很慢。

+0

某處,一隻狗叫了一聲。 – Grumdrig 2012-04-29 15:57:07

回答

0

爲了可能有一天會看到這個問題的兩三個人,我認爲SDL_Flip需要這麼長時間的原因是它等待vsync,因此調用SDL_Flip的繁忙循環必然受到vsync率。

如果這是正確的,那麼SDL_Flip需要這麼長時間的事實並不是一個真正的問題,因爲如果我正在進行渲染工作,那麼等待vsync的時間會更少。

0

我使用Win7,Codeblocks/MingW,SDL 1.2.14。 Grumdrig說:

對於兩個或三個人的緣故,可能,有一天,看到這個 問題,我覺得SDL_Flip這麼久的原因是,它 等待垂直同步,所以一個繁忙的循環調用SDL_Flip必然是 受vsync速率限制。

如果這是正確的,那SDL_Flip需要這麼長時間的事實是不是 實際的問題,因爲如果我在做工作,以渲染的東西,然後 有會是更少的時間來等待垂直同步。

那麼,有什麼不對。我的程序運行良好,直到最近,我花了一段時間,我自己今天尋找我自己的瓶頸,結果是SDL_Flip()像你的原因,這導致我通過谷歌搜索你的問題。有趣的是,在我的舊版WinXP單核上性能更好,所以我的猜測是這個問題是由友好的Win7自動更新引起的。也許微軟無意中對GDI進行了優化!在任何情況下,SDL_Flip不應該花費那麼長時間來解決它自己,並且如果有人想知道,我會在SDL_Flip()上方放置一個Uint32 SDL_Getticks()定時器,並輸出下面的長度,如果它超過5 ms。其結果是不時有27,59和88毫秒的數字,這並不好。當然,無論我使用SWSURFACE還是HWSURFACE作爲SetVideoMode的標誌,問題都是一樣的。

在我對SDL網站發表評論之前,我可能會嘗試使用SDL 1.2.15進行重建,但這可能需要重建SpriG,所以我並不急於。但總的來說,我堅持我所說的:有可能,如果這是你的操作系統,那是一個Win7的東西。

附錄5:17 PM EST:我剛剛編譯並運行了一個使用SDL 1.2.15的小型無關項目,問題是一樣的:正常的平滑運動,偶爾出現混亂。僅當SDL_Flip()花費超過5毫秒時才進行測試,輸出包含30到60毫秒以上的值,每隔一兩秒發生一次。

附錄5-8-12:5-4-12有一個大的雷雨,我不得不關掉電腦,結果第二天SDL_Flip()總是在5ms以下,所以現在問題得到解決。

+0

由於我在Mac上,Windows對我來說不是一個因素。這聽起來像是你看到了與我不同的東西,因爲我的SDL_Flips每次都在10毫秒的幾個ms內。 – Grumdrig 2012-05-07 18:16:33

+1

我的印象是,由於操作系統GUI運行在硬件表面,所以蘋果將所有的精力投入到硬件表面,因此可能會將責任推向欠佳的軟件表面。感謝帖子,無論如何,這對我都很有用,而且我確實解決了上述問題的版本問題。 – formerBGIuser 2012-05-08 17:12:44