2012-07-22 39 views
1

我想爲91圖像緩存圖像。所有圖像大約50mb。我發現很多內存都用完了。圖像緩存方式爲iPhone中的高效內存

我的代碼在這裏。高效內存的最佳方式是什麼?

lG2Image[0] = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"background" ofType:@"png"]]; 
lG2Image[1] = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myimage1" ofType:@"png"]]; 
lG2Image[2] = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myimage2" ofType:@"png"]]; 
... 


UIImageView* tmp; 

for (int i=0; i<91; i++) { 
    tmp = [[UIImageView alloc] initWithImage:lG2Image[i]]; 
    [_window addSubview:tmp]; 
    [tmp removeFromSuperview]; 
    tmp = nil; 
} 
+0

爲什麼您需要將所有91張圖像預加載到內存中?你可不只是提前加載一個或兩個圖像? – Pfitz 2012-07-22 08:52:44

+0

這就是遊戲關卡。所有的圖像都在一個層次上。「背景,動畫,效果,人物,物體......」遊戲就像那個馬里奧。 – iamugur 2012-07-22 14:07:59

回答

0

您可以重新使用UIImageView

iPhone的畫面尺寸是固定的,這意味着visable區域是固定的。 例如,如果您visable屏幕上要顯示3張圖片,你可以創建3個UIImageView S,當視圖移動,可以加載根據當前可見視圖的位置的新形象,這不是可見的屏幕上的圖像可以是釋放。

如果使用UITableView,你可以看看這個,LazyTableImages

0

您有2個選項。選項1,只需加載遊戲圖像元素「視需要」,如果這是2D遊戲,則在元素即將加入屏幕時加載元素。選項2,將圖像數據解壓縮爲BGRA格式的原始像素文件,然後使用[NSData dataWithContentsOfMappedFile]和CGDataProviderCreateWithData()以及CGImageCreate()創建一個CGImageRef,然後將其作爲UIImage進行包裝。第二種方法是非常低的水平,但它避免了每次訪問資源時必須再次解析圖像內容(解壓縮後的圖像數據已存儲在文件中)。此外,Apple已經優化了CoreGraphics讀取二維圖像的方式,以使整個存儲器內容可以保留在主存中,而不是複製到圖形存儲器,這意味着您可以使用此方法加載一堆圖像。如果可以的話,我會首先嚐試選項#1,您可能不會同時需要內存中的所有內容。但是選項#2可以給你大約700M的工作內存,你的iOS應用程序可以從文件映射出來,遠遠超過可以分配爲常規內存。