2012-01-11 72 views
8

這不是一個關於解決特定問題的問題,而是更多的要求指向正確的方向。UIImageView vs UIView w /圖像 - 效率

我正在製作一個應用程序,我在同一時間將多個圖像(保存爲JPG)加載到屏幕上,這必須是它的樣子,我不能卸載它們中的任何一個,因爲它們都是立即顯示。

我試着以約800px * 600px的分辨率天真地加載30張圖片,認爲它只會將圖片的'壓縮'大小加載到內存中(這大約爲200 KB) - 總共6 MB?當然,後來幾次記憶警告,我意識到我是多麼愚蠢。所以我現在將它們重新調整爲大約400px * 300px,而我的iPhone 4S恰好滿足了內存需求。

我最初使用的UiView在drawRect中繪製了一個自定義繪製的圖像,但切換到使用UIImageView可以顯着改善這種情況。該應用程序速度更快,響應速度更快。 我還發現,關閉我的圖層中的柵格化在性能上有很大的不同。

這些類型的「發現」花費了我數小時才解決的問題,我想知道的是,是否有特定的設計模式或資源可用於儘可能高效地將圖像加載到屏幕上;主要是關於儘可能少的記憶 - 是否有很好的經驗法則?爲什麼使用UIImageView和UiView w/image會產生如此不同?

非常感謝,如果有人能幫助。

謝謝。

回答

9

實現-drawRect:會導致系統爲您的視圖分配一個與您的視圖大小相同的位圖圖像(畢竟,您需要一個緩衝區來吸取)。如果您所做的只是繪製一張您已經加載的圖像,那麼您一舉將該圖像的內存使用量翻了一番(因爲您已加載了您加載的副本,以及剛剛繪製的第二個副本)。

類似地,柵格化圖層需要分配與圖層大小相同的位圖圖像,因此它具有要光柵化的緩衝區。因此,這樣做也會吸收內存(與圖層的大小成比例)。

基本的經驗法則是,不要做額外的工作。使用-drawRect:來繪製圖像是額外的工作。柵格化圖層是額外的工作(儘管取決於圖層的內容,這可能是一次性性能成本(以及不斷的內存成本),以便以後節省性能,例如,如果它是CAShapeLayer或者它正在繪製陰影)。將大圖像保存在內存中,在渲染到屏幕之前總是縮小,這是額外的工作(加載圖像時縮小一次,並保留縮放的副本)。

要記住的另一件事是,如果你的目標是繪製圖像,你應該嘗試使用UIImageView,如果你可能的話。它通常是將圖像顯示在屏幕上的最快和最便宜的方式,並且它具有相當的靈活性。

8

設計模式基本上是用UIImageView。蘋果已經花了很多時間讓它變得更快,並且蘋果被允許使用你不是的私人API。

也就是說,如果你想自己做,你應該嘗試使用一個CALayer每個圖像。您只需加載圖像並將其設置爲CALayercontent屬性。 CALayer可以將其內容緩存在GPU內存中,並可以執行其他優化,這是您無法使用公共API進行的優化。

您可以通過觀看Apple的開發視頻瞭解很多有關快速製作用戶界面的知識。它們包含許多技巧和「內部信息」,它們不在書面文檔中,或者在文檔中很難找到/容易忽視。開發視頻如下:http://developer.apple.com/videos/。有關你的問題的一些好的:

  • iOS版 - 「理解的iOS查看合成」
  • WWDC 2011 - 「理解的UIKit渲染」
  • WWDC 2011 - 「爲iOS開發實用製圖」
  • WWDC 2011 - 「核心動畫綱要」
  • WWDC 2010 - 「核心動畫實踐」
+1

感謝您的聯繫 - 他們是非常有用的。 – Vazzyb 2012-01-13 16:22:20

+2

+1從Apple推薦一些視頻(特別是因爲蘋果的搜索和觀看這些視頻的界面是可怕的!) – 2013-04-09 21:21:45

+0

@KevinZych你有沒有檢查過使用[asciiwwdc.com](http://asciiwwdc.com)? – Honey 2016-09-23 19:44:33