2012-02-22 89 views
7

我只想做一些簡單的動畫(例如在使用OpenGL的C++中)一些移動物體 - 讓我們說一個正方形從左到右的簡單水平移動。OpenGL - 簡單的水平移動物體的「超平滑」動畫

在OpenGL中,我可以使用「雙緩衝」的方法,讓我們假設一個用戶(運行我與動畫應用程序)打開了「垂直同步」 - 所以,當顯示器刷新本身我可以調用一些功能,每次(我可以使用Qt工具包及其功能「swapBuffers」來實現這一點)。因此,我認爲,我可以實現的「最平滑」的動畫是「每次監視器刷新時,將平方移動例如1個像素(可以是其他值)」,因此在每個「幀」處,方形進一步增加了1個像素 - 「我已測試過這款產品,而且它表現平穩。」

但是,當我想爲「遊戲邏輯」(將正方形向右移動1個像素)和「動畫」(顯示屏幕上正方形的當前位置)「分離」線程時出現問題。因爲我們假設遊戲邏輯線程是一個while循環,其中我將廣場移動1個像素,然後「休眠」線程一段時間,例如10毫秒,並且我的顯示器每16毫秒刷新一次 - 平方的移動「不會100%平滑」,因爲有時顯示器會刷新兩次,其中方塊只移動1個像素而不是2個像素(因爲顯示器和遊戲邏輯線程有兩個「不同」頻率) - 移動會看起來「小疙瘩」。因此,邏輯上,我可以使用第一種超級平滑方法,但是它不能用於例如「多人遊戲」(例如「服務器 - 客戶端」)遊戲 - 因爲不同的計算機具有不同的監視頻率(所以我應該爲遊戲邏輯(在服務器上)和動畫(在客戶端上)使用不同的線程)。

所以我的問題是: 有一些方法,使用遊戲邏輯和動畫不同的線程,從而做一些運動物體的「100%流暢」的動畫,如果一些存在,請在這裏形容它,或當我只是有一些「更復雜的場景渲染」,我只是不會看到我現在看到的「小動作」,當我沿着水平方向移動一個簡單的方塊時,我會深深地關注它:)?

回答

6

那麼,這實際上是典型的單獨的遊戲循環行爲。您在一個線程中管理所有物理(移動)相關的操作,讓渲染線程完成其工作。這實際上是可取的。

不要忘了這種實現遊戲循環的方式是在保持恆定物理速度的同時擁有最大可用幀速率。在更高的FPS下,如果沒有其他與代碼相關的問題,則無法看到此效果。例如,一些鉤住框架和物理之間的東西。

如果你想實現你所描述的完美平滑,你可以使用VSync同步你的物理引擎。簡單地做所有你的物理學之前刷新踢,而不是等待另一個。

但是,這一切都適用於恆速物體。如果您的對象具有動態速度,則永遠無法知道何時將其繪製爲「同步」。同樣的問題出現,那麼你想要不同的恆定速度的多個對象。

此外,這不是你想要的複雜場景。 V-sync的整個想法是限制屏幕撕裂效應。你絕對不應該勾住你的物理或渲染代碼來顯示刷新率。你想讓你的物理代碼獨立於用戶運行顯示刷新率。例如,這可能是多人遊戲中的真正痛苦。首先,看看這個網頁:How A Game Loop Works

編輯: 我說你的完美光滑的願景是不現實的。你可以用凱文寫的技巧來掩蓋它。但是,你總是會爲刷新率或顯示像素化而苦苦掙扎。例如,您有640x480像素的窗口。現在,你希望你的物體水平移動。您可以通過矢量標題朝右下角移動對象,但是您必須通過浮點數(640/480)遞增對象座標。但是在渲染中,你會使用整數。所以你的對象移動鋸齒。沒有辦法繞過這個。在小速度下,你可以注意到它。你可以模糊它,或使其移動得更快,但永遠不會擺脫它...

+0

所以總而言之,你說我無法在多人遊戲中實現「完美的光滑效果」? – 2012-02-22 22:49:57

+0

取消我的回答:) – 2012-02-23 08:14:08

+0

好的非常感謝你。你已經打勾:) – 2012-02-23 09:12:11

5
  1. 允許您的對象移動一個像素的分數。在OpenGL中,可以通過將正方形繪製到紋理(即一個像素或更大的邊框)上,而不是讓它僅僅是多邊形邊緣,來完成這個方形示例。如果你正在渲染2D精靈圖形,那麼你可以自動獲得這個圖像(但是如果你有1:1像素藝術,它會在跨越像素邊界時變得模糊/清晰/模糊)。

  2. 平滑(抗鋸齒)多邊形邊緣(GL_POLYGON_SMOOTH)。這種技術的問題在於,它不適用於基於Z緩衝區的渲染,因爲它會導致透明度,但是如果您正在執行2D場景,則可以確保始終以後面的方式進行繪製。

  3. 啓用多采樣/超採樣抗鋸齒,這種方法比較昂貴,但沒有上述問題。

  4. 使您的物體具有足夠的動態外觀,即像素偏移不易察覺,因爲在該邊緣有更多的事情發生(即它自身在遠遠超過1個像素/幀處移動)。

  5. 使您的遊戲足夠複雜並引人入勝,讓玩家分心注意像素。:)

+0

好的提示,以平滑事情的眼睛:) – 2012-02-22 22:15:59

+0

謝謝你的平滑技巧,但我已經打勾到「 B.Gen.Jack.O.Neill「獲得更全面的答案。 – 2012-02-23 09:13:16