2014-03-18 72 views
1

這對我來說沒有意義。我看了GLFW和Three.js的例子和Cinder的實現,其中有this comment其中有:爲什麼我們在繪製()之前update()?

將所有窗口標記爲可以繪製;這真的只在乎第一 時間,保證在第一次更新()繪製之前觸發()

所有三個庫似乎在做這一點,我不明白爲什麼。更新屏幕上或從未繪製過的東西的位置真的沒有意義嗎?

這裏是我的循環是什麼樣子:

  1. 繪製(第一)幀
  2. 交換緩衝
  3. 更新事件
  4. 動畫(從事件的輸入),更新邏輯。 ..
  5. 從頂部

這個順序啓動使得LO對我更有意義,但也許我錯過了一些東西。

回答

1

我認爲最好先更新對象然後再繪製它們。

想象一下,您可以將一個球從屏幕的一側移動到另一側,然後像鐘擺一樣向後移動。想象一下,你也希望它能夠真實反映你電腦的實時狀態。如果您在更新球的位置之前繪製場景,那麼球的位置將在第一幀?除非手動設置初始位置,否則它將處於場景的零點,可能完全超出了預期的軌跡。如果您決定在動畫開始之前初始化它的位置,則可能會發生時間間隙,導致它位於錯誤的位置。

但是,如果您始終在繪製之前更新它的位置,它將位於第一個渲染幀的正確位置。

但說實話 - 沒有人會注意到第一幀,所以更多的邏輯意義上是這樣做的,而不是任何實際的原因。我只是覺得在繪製前準備場景更有意義,反之亦然。

+0

零初始化實際上是一個好點;不能相信我沒有那樣的事情。我想在概念上你會初始化設置方法中的所有變量,但是最終我會得到很多重複的代碼。 – superlukas

+0

是的,確切地說。當我更多地考慮它時,最後一幀也是不正確的。如果您在更新之前繪製,那麼您的框架基本上會將對象顯示爲處於最後呈現週期中的「有」狀態。如果您想實現某種播放/暫停功能,那麼如果您暫停了動畫,則不會看到最後一幀,而是前一幀。當你再次開始時,你會首先看到在暫停前應該是最後一個的框架。 – lot

相關問題