2

我有一個圍繞彎曲今年夏天將涉及潛在的,圖像數據的顯示非常高的音量來的項目。在給定的應用程序會話中,我們正在討論數百張640x480-ish圖像(顯示時縮放到較小的分辨率),以及一次很大(1280x1024或更高)的圖像。iPhone OS:策略高密度影像工作

我已經做了一些初步的工作,我發現典型的640x480ish圖像只是放在UIImageView中時顯示在內存1MB以下並且顯示的內容......但是非常大的圖像可能是高達5在某些情況下+ MB。

該項目實際上是在iPad上,這在我的測試儀器在似乎封頂了有關的可尋址的物理內存80-100MB的針對性。

細節不談,我要開始的如何同時保持應用程序,這將是高知名度的流動性和響應移動虛擬和物理內存之間的圖像數據的海量思考。

我可能就在中間的Objective-C的兩端更高...所以我要尋找以下一些固體物品和建議:在名稱中的UIImage和UIImageView的的

1)負責管理節省物理RAM 2)使用CGImage過的UIImage,特別是對於大的圖像的優點,和是否會有任何性能增益 3)任何處理存儲器分頁特別因爲它涉及到圖像

我將結語通過說我上面的數字可能會減少10%或15%左右。圖像可能會或可能不會被綁定到實際的應用程序本身,而不是從外部服務器加載。

回答

1

CATiledLayer可能是要走的路。爲每個圖像創建UIImageView的唯一原因是如果您需要爲您管理的交互性。 CATiledLayer將允許您根據需要從後臺線程異步加載和繪製圖像。只需使用CGImage,因爲無論如何您都可以繪製到圖層中。

您可能希望實現自己的線程化圖像緩存,以便您可以對保存在內存中的圖像數加上上限,並在您預測很快會需要時啓動圖像加載。如果在繪製請求進入時加載沒有完成,則可以阻止繪製線程。

0

圖像通常有很多重複的數據,是壓縮的好主題。這取決於您使用什麼格式的圖像,以及它是否內置了壓縮。我的第一個想法是堅持PNG格式,因爲它的原生的iPhone,並以某種方式使用壓縮存檔的大部分圖像。類似.zip或.rar。

,如果你能確定用戶可能遇到的,那麼你可以解除存檔並將其呈現給用戶的圖像的批次。子集「縮略圖」檔案的使用也是有用的。

我不知道這一切的壓縮和解壓縮會做你的響應時間,但它的一個想法,讓您的內存佔用低。

+0

您是否知道PNG作爲原生格式相對於磁盤大小會導致更低的佔用空間?目前由於架構需求,所有問題中的圖片都是JPEG格式。他們的來源,但是我可以寫一個批處理作業來轉換它們。假設Apple有一些複雜的PNG處理方法,我可以相信這樣一種情況:沒有得到很好支持的JPEG可以咀嚼更多的內存而不是PNG。 – 2010-04-21 15:50:46

+0

我會堅持使用JPG格式,它們在大多數圖像上的線條更加可壓縮,並且沒有證據表明它們的渲染效率更高。 一些食物在這裏思考: http://stackoverflow.com/questions/800926/jpg-or-png-for-uiimage-which-is-more-efficient – 2010-04-28 16:08:30

+0

如果你已經在JPG,那麼我想你是罰款那裏。我同意以上所述。 – 2010-04-28 19:32:07

0

這是一個相當大的問題,所以我會指出你一個項目,是一個開源的地圖視圖。您可以通過將服務器添加爲數據源來重新使用該項目(如果它基於lng/lat的話可能有意義),或者您可以採用一些設計模式並直接實現您的要求。

http://code.google.com/p/route-me/source/browse/trunk#trunk/MapView/Map

您的圖片或1MB,5MB的是不是一個問題,因爲你只能在一次顯示1個或4圖像的事實。然後是一個異步緩存加載器,它根據用戶下一步可能看到的內容填充圖像緩存。然後在用戶交互時,從緩存中取出圖像(或緩存未命中的微調器),並將其添加到CALayer並將其彈出到CALayer層次結構中。

有很多性能/使用問題。我會與上面的項目中的某人取得聯繫,或者跟隨他們的領導。根據我所瞭解的項目,這意味着一個UIView傳遞事件的父容器,並使用CALayers進行所有的平鋪。 CGImageRefs在CALayers中使用,所以也堅持這些。

希望這會有所幫助。