2011-02-04 81 views
0

一個珍聞在遊戲中我們的互聯網組裝團隊編程,我們假設從我們的觀衆每個人都會有大大超過在比賽中全速。完美的V-同步實施:需要的信息

所以,保存視頻RAM,並希望給多一點空閒時間到顯卡,採用V-不同步雙緩衝將是我們最好的選擇。所以,在OpenGL中,我們需要知道如何做到這一點。

從我的理解,垂直同步時,一旦它完成渲染一幀,直到幀已經完成發送到顯示設備顯卡被暫停。雙緩衝不會暫停渲染操作(或者它可能,或者它可能是特定於實現的;不確定),因爲它在複製到幀緩衝區之前會將其繪製到第二個緩衝區,以便監視器獲得全幀或無新的幀(特別是幀緩衝區中的最後存儲的圖像)。好吧,我們不需要這個功能,只要顯卡只在它需要的時候才寫入framebuffer。

這是一個非常緩慢的在線遊戲(但它非常有創意^ _ ^)。有很少的實時行動。因此,非常精確的用戶輸入不是必需的;它可以在渲染幀之前的任何時候作爲單個單元從OS捕獲。

所以,爲了做正是這一點,我需要能夠得到一個「幀發送完監視」從OpenGL的消息。可能嗎?如果不是,最好的選擇是什麼?

遊戲進行編程僅適用於Windows的時刻,但應該有幾個月的Linux所做的工作。

+0

視頻卡被設計成具有雙緩衝足夠的內存。所有的遊戲都在使用它。此外,驅動程序層不會直接控制「幀何時發送到顯示器」。對於這個問題,你準備好用多臺顯示器來處理這些情況嗎?你願意只工作在全屏嗎? – Bahbar 2011-02-04 08:44:23

回答

8

您受V-Sync所做錯誤觀念的影響。視頻RAM中有一部分以恆定速率連續發送到顯示設備,即幀刷新率。所以在一個完整的幀被髮送之後,下一幀在非常短的空白時間之後被髮送。但發送幀之間的時間比發送全幀所用的時間要短得多。

沒有V-Sync會發生什麼情況,幀緩衝區內容的操作是可見的,例如,如果幀被紅色和綠色交替填充,並且沒有V-Sync,您將看到紅色和綠色波段顯示器。爲了避免這種情況,V-Sync會在顯示驅動程序發送完整幀後立即交換顯示驅動程序用於訪問幀緩衝區的指針。

這給我們帶來了什麼doublebuffering。沒有雙緩衝,V-Sync幾乎沒有用處。由V-Sync觸發的動作必須非常快速地發生。因此,這可以歸結爲交換指針或非常快速的blitting操作(可能通過簡單地爲GPU的MMU設置CoW屬性)。

沒有doublebuffering和無V-Sync中的效果是,可以看到,其中的圖像是由一塊呈現片到幀緩衝器的過程。當然,如果發生了渲染比幀週期更快,這具有自上而下的,你會看到一個只有人口稀少的圖像有越來越多的內容向bottem可見,並且中間某個位置,它會擊中屏幕下方邊緣的影響,繞到頂部。相交線將會移動。

TL; DR:只是使用雙緩衝,使垂直同步用於緩衝交換。不要害怕內存消耗。目前流通的所有GPU都擁有足夠的內存來輕鬆爲雙緩衝色彩平面提供內存。只需做數學運算:1920x1200 * RGB = 6MiB,即使是目前個人電腦中最小的GPU也能提供至少128MiB的RAM。移動設備,比如iPad 1024 * 768 * RGB = 2MiB與32MiB的圖形。無論如何,iPad的UI都是雙緩衝的。

0

您可以使用wglGetProcAddress來獲取地址wglSwapIntervalEXT,然後撥打wglSwapIntervalEXT(1);以使更新與垂直同步同步。當你這樣做時,你不會在垂直同步中收到消息 - 而是glFlush直到發生垂直回退時纔會返回,並且屏幕已更新。所以,你有一個WM_PAINT處理,看起來是這樣的:

BeginPaint 
wglMakeCurrent 
do drawing 
glFlush 
EndPaint 

glFlush需要在任何情況下,確保你已經做了被髮送到屏幕上繪圖。

+0

允許OGL實現執行暫停聽起來更加優雅和「有意」,但我必須在單獨的線程中運行它才能捕獲輸入。 (不是問題)。另外,您指向的函數使用單獨的繪圖緩衝區,如果剛剛在監視器讀取後立即將幀渲染到幀緩衝區中,則不需要該緩衝區。我希望我不會聽起來固執地尋找特定的答案......因此,如果沒有人用更好的解決方案做出迴應,那麼我會和你的(和整個互聯網,就像大量的谷歌搜索所示)一樣提出建議。謝謝傑裏。 – daddesio 2011-02-04 07:13:10

+0

哦,嘿!掃描通過了OpenGL規範,我發現有一個GLX擴展glXWaitForMscOML,它等待MSC(媒體流計數器),「一個計數器所特有的對發生的每個垂直回掃圖形子系統和增量」。不幸的是,我懷疑WGL是否有相同的功能。有趣的是,這可以繞過用戶可能在其圖形設置中設置的任何「強制v同步關閉」選項。這讓我感覺很糟糕:P,但在這種情況下,它肯定會更好。 – daddesio 2011-02-04 07:37:24