2010-08-22 38 views
2

我有一個應用程序,我正在處理一個滾動視圖中一次處理大量圖像的應用程序。 (下面是它的外觀,每個藍色塊在滾動視圖中的圖像向右擴展:http://i.stack.imgur.com/o7lFx.png)所以爲了能夠處理這種大的壓力,這會帶來記憶。所以我實現了一系列技術,比如重複使用圖像瀏覽等,這些技術在保持我的內存使用率方面都非常成功。我所做的另一件事是,不是將實際圖像保存在內存中(我當然不能爲所有這些內容執行操作,因爲它會非常快地耗盡內存),我只將圖像的文件路徑保存在內存中,然後在讀取圖像時用戶滾動到該圖像附近的滾動視圖的區域。然而,雖然這是高效的內存,但由於它必須不斷從磁盤讀取圖像,因此在滾動視圖中會造成很多滯後。我想不出如何解決這個問題。基本上現在應用程序只在屏幕上繪製可見的uiimageviews,而用戶滾動應用程序將查看是否可以使另一個imageview出列,因此它不必分配另一個imageview,並在此時將圖像讀入內存,但正如我所說,這導致滾動動作非常緩慢。任何想法用於解決這個問題?有沒有人知道本地照片應用程序處理這種事情?非常感謝!iPhone:快速讀取許多圖像

+0

縮略圖有可能嗎?或者那是你目前在做什麼?我猜想閱讀縮略圖應該比閱讀全尺寸圖片更快,然後將其縮小以適應。我從來沒有做過與iPhone手機有關的任何事情,所以我只是在想(不是真的是答案或任何東西)。 – avacariu 2010-08-22 03:31:59

+0

是的,我已經在使用縮略圖了。基本上它是更多的代碼我設想的設計。現在我已經做了非常好的工作(不要試圖表現出傲慢),儘可能減少內存使用量,包括使用小圖像文件智能分配和釋放方法等......但是我們的方式當我們讓用戶在視圖中快速滾動時,每次需要時都會讀取圖像文件變得非常慢。如果不使用大量的內存,JUST就無法想辦法解決這個問題。 – Alexander 2010-08-22 03:33:58

回答

1

我可以建議你一個簡單的解決方案來平衡內存和計算機處理。你只能在內存中保留縮略圖等小圖片,而且只能保留其中的20張。我正在做的一個項目中,我最近訪問了20個縮略圖(100 x 100),這不會花費太多內存。我認爲它總是花費大約200kb,但與一般可用內存相比較。我認爲這夠好。

這也取決於你的用例:如果用戶滾動得非常快,你不知道他們什麼時候去。你可以有比thumnail更小的圖像,當你在UIImageView上顯示它時,你可以調整它的大小以適合它。當用戶停止滾動一段時間時。你可以開始加載更大的圖像,然後你有更好的圖像。用戶甚至可能不會注意到這個過程

我不認爲有一種解決方案可以快速並儘量少使用內存。因爲我們有記憶,也許不大,但如果我們巧妙地使用它,就足夠了。

1

慢速滾動性能可能意味着您在加載圖像時阻塞主線程。在這種情況下,滾動動畫將不會繼續,直到加載圖像,這確實會導致非常不連貫的滾動性能。

當主線程繼續處理滾動動畫時,最好在後臺中延遲加載請求的圖像。提供此功能的庫(其中包括)是'three20'庫。請參閱Tidbits文檔,並向下滾動到描述「TTImageView」類的底部。

0

我有一個PDF查看器的類似問題,建議這樣做的方法是儘可能降低res圖像的容量,如果您允許用戶將圖像向上/縮放,則有兩個版本或三個版本的圖像增加您的水庫。

將盡可能多的代碼放在didDecelerate方法中(如加載更高分辨率的圖像,如vodkhang談論),而不是處理didScroll中的加載。如您所說,回收視圖超出範圍。並提防自動釋放的基於上下文的圖像創建功能。

智能地在後臺線程中加載圖像(基於scrollView偏移位置和縮放級別),並考慮使用CALayer /平鋪圖層繪製更大的圖像。

Three20(一個開源的iOs庫)有一個很棒的照片查看器,可以被子類化,它具有縮略圖導航,大圖片分頁,緩存和開箱即用的手勢。