2016-05-25 84 views
1

我從網頁上Tuning Your OpenGL ES App閱讀:重繪場景時的場景數據的變化

重繪場景只有在場景數據的變化: 您的應用程序應該等待,直到場景變化的東西渲染新幀之前。核心動畫會緩存呈現給用戶的最後一幅圖像,並繼續顯示直到出現新幀。

即使數據發生變化,也不需要以硬件處理命令的速度渲染幀。對於用戶而言,較慢但固定的幀速率通常比快速但可變的幀速率更平滑。對於大多數動畫來說,每秒30幀的固定幀速率已足夠,並有助於降低功耗。

從我的理解,有一個事件循環,不斷運行和重新渲染場景。我們只是覆蓋方法並將渲染代碼放在那裏。我無法控制何時調用此方法。那麼我怎麼才能「重繪場景只有當場景數據變化」?

就我而言,只有當用戶進行交互時(點擊,捏等),場景纔會有變化。理想情況下,當用戶不與我的場景進行交互時,我想不渲染,但是此函數正在不斷調用。很困惑。

+0

Re:「'onDrawFrame'」 - 這不是iOS提供的,不是GLKit的一部分,也不遵循Objective-C或Swift慣用的命名約定。那麼它從哪裏來?這很可能來自答案的來源。 – Tommy

回答

1

在最低暴露級別,有一個包含OpenGL的CoreAnimation圖層,CAEAGLLayer。這可以提供一個可用於構建幀緩衝區對象的顏色緩衝區,您可以根據需要繪製幀緩衝區對象,並根據需要進行演示。所以這就是iOS中OpenGL的全部過程:當你想要的時候繪製,當你想要的時候呈現。

然後該圖層具有場景的像素副本。正常的核心動畫規則適用,所以你永遠不會自動被要求重畫。完整的作曲,轉換,核心動畫動畫等都可以在你沒有任何工作的情況下進行。

無論是手動還是僅利用GLKit構造之一,連接定時器(通常爲CADisplayLink)是相當常見的做法。在這種情況下,你正在試圖爲每個計時器滴答產生一幀。蘋果公司建議以刷新率的一半運行計時器是可以接受的,如果你醒來後進行抽籤,並意識到你只是繪製與上一次完全一樣的畫面,那麼根本就不會畫畫。如果你有足夠的遠見,理想的是完全停止計時器。

根據評論,沒有像Objective-C或Swift方法那樣措辭,也不是由任何Apple提供的庫提供的。無論發佈什麼內容 - 大概是爲了讓Android作者看起來很熟悉 - 都需要對適當的行爲負責。