2015-06-01 65 views
1

當我使用SDL庫設置內存中的像素值並更新屏幕時,每當更新過快時都會發生屏幕撕裂。我不知道很多有關SDL內部,但我從我看到的理解是:爲每幀分配一個新緩衝區以防止屏幕撕裂

  1. 更新函數信號圖形硬件來讀取(比方說)buffer1像素數據後立即返回。
  2. 下一幀畫在buffer2上,並再次調用更新,但這太快了,從buffer1的讀數仍未完成;
  3. 我的程序並不知道任何有關硬件的信息,並假設它可以在buffer1中再次繪製,而此緩衝區正在發送到顯示器。
  4. 屏幕被撕裂。

當待塗物體的速度不是太快時,這並不是一個大問題。屏幕仍然流淚,但人眼幾乎不可見,但如果這種撕裂完全沒有發生,我仍然會很高興。我不喜歡垂直同步,因爲它會在每一幀產生一致的延遲。

我的想法是,可能會分配一個新的屏幕緩衝區,每幀將被繪製。當監視器想要顯示某些內容時,它應該從最新的緩衝區讀取數據。

這是一種已經在實踐中使用的方法嗎?如果我想測試我的想法,我可以使用什麼樣的低級和跨平臺庫或API? SDL? OpenGL的?

+2

不具有任何與緩衝區一個很好的鏈接,一切跟你更新屏幕的確切時間。谷歌「sdl垂直同步」,你不能錯過SDL_RENDERER_PRESENTVSYNC。 –

+1

可能嗎?是。可能? **沒有**。通常你會看到使用雙(2)或三(3)緩衝。緩衝區被預先分配。 –

+0

@HansPassant我知道我總是可以做垂直同步,我在原文中提到過它,我想避免它的一致性延遲。 – xiver77

回答

2

你認爲更新屏幕比人眼更快嗎?如果您確實必須讓引擎100%獨立於回掃,請使用三重緩衝系統。顯示一個緩衝區,以及2個緩衝區來回更新,直到屏幕準備好進入下一個緩衝區。如果您填充第二個後臺緩衝區,則Triple需要儘可能高,您可以改寫現在不存在的第一個後臺緩衝區。沒有GPU滯後,只有3個緩衝區。

Here是描述與有關使用它在現代GPU一些警告沿着這條技術...

+0

您的鏈接回答了我所有的問題! – xiver77