2013-04-24 32 views
3

爲了澄清,我知道使用多個不同圖像時紋理圖譜可以提高性能。但是我非常感興趣的是,當你不這樣做時,事情是如何完成的。UIImageView如何動畫如此流暢? (或者:如何讓OpenGL高效地逐幀渲染動畫)

我嘗試在自定義OpenGL中手動執行一些逐幀動畫,其中每個框架綁定一個新紋理並在同一個點精靈上繪製它。它可以工作,但與抽象相同的能力相比非常緩慢。我在前面加載所有紋理,但重新綁定是在每一幀完成的。相比之下,UIImageView接受單個圖像,而不是紋理圖集,所以我可以想象它的效果是相似的。

這些是76個圖像單獨加載,而不是作爲紋理圖集,每個都是大約200px的正方形。在OpenGL中,我懷疑這個瓶頸是在每一幀重新綁定紋理的要求。但UIImageView如何做到這一點,因爲我期望有類似的瓶頸?是否UIImageView以某種方式在幕後創建了一個圖集,因此不需要重新貼圖紋理?由於UIKit最終在它下面運行了OpenGL,我很好奇它是如何工作的。

如果有動畫多重紋理,而不是換出不同的質感結合OpenGL中的每一幀,我想知道,因爲它可能在什麼蘋果在他們的框架做暗示了更有效的手段。

如果我確實在一秒鐘內爲60幀中的每一幀獲得了一個新幀,那麼在我的76幀中動畫將花費大約1.25秒。事實上,我通過UIImageView獲得了這個結果,但OpenGL需要大約3到4秒。

回答

0

我會說你的瓶頸在別的地方。 openGL更有能力按照自己的方式進行動畫製作。由於所有紋理都已加載,並且每幀僅綁定一個紋理,因此不存在加載時間或其他任何內容。考慮比較我有一個應用程序,可以在運行時生成或刪除紋理,並可以在GPU上加載大量紋理,我必須綁定所有這些紋理每幀(不是每一幀),使用所有從深度緩衝區,模板,多個FBO,大量的用戶輸入,大約5個線程瓶頸到1來處理所有的GL代碼,我根本沒有任何問題。

由於您正在使用iOS,我建議您運行一些分析器來查看哪些代碼負責開銷。如果由於某種原因,您的時間分析器會告訴您,glBindTexture的行時間太長,我仍然會說這個問題在其他地方。

所以要回答你的問題,UIImageView能夠如此順利地完成它的工作並且在openGL中實現相同的性能應該沒有問題是很正常的。儘管如此,在這一點上還有幾件事情需要考慮。你怎麼能說圖像視圖不會跳過圖像,你可能會設置一個指向每秒60次的不同圖像的指針,但圖像視圖可能每秒要問自己30次重繪,以及何時它只使用分配的當前圖像到它。另一方面,如果您的GL代碼能夠這樣做,則迫使應用程序執行重繪60FPS。

考慮到所有因素,蘋果開發者爲您創建了一個稱爲顯示鏈接的東西。我相信它的意思正是你想要做的。顯示鏈接會告訴你幀之間已經過了多少時間,並且通過該鍵你應該問自己要綁定什麼紋理,而不是在可能太短的時間內強制所有紋理。

另一件事,我已經看到,如果您嘗試在大多數iOS設備上以100 FPS呈現渲染緩衝區(可能都是),則只會獲得60 FPS,因爲呈現緩衝區的方法會暫停您的線程if它被稱爲不到1/60秒。這就是說,在iOS設備上以60 FPS顯示任何內容都是不可能的,而運行30+ FPS的所有內容都被認爲是好的。

+0

謝謝,我會做更多的挖掘,以瞭解我在分析中發現的內容等等。順便說一下,60 fps並非完全不可能,我經常用簡單的2D遊戲來獲得它。 – johnbakers 2013-04-24 18:15:52

-1

「不作爲紋理地圖集」是對我來說是一面紅旗的句子。

使用紋理圖集是一件好事情....紋理一次加載到內存中,然後您只需移動矩形位置即可播放動畫。這很快,因爲它已經在記憶中。任何涉及不斷加載和重新加載新圖像幀的操作都將比此慢。

您必須發佈源代碼才能得到比這更精確的答案。

+0

我的問題是UIImageView如何在沒有紋理圖集的情況下如此有效地工作。 – johnbakers 2013-04-24 03:24:31