2012-11-16 23 views
3

我正在使用大量詳細圖形的項目。由於隨時顯示的精靈,背景等數量衆多,因此內存佔用量較大。我們使用cocos2D作爲動畫和精靈,UIKit用於用戶界面,菜單等。任何方式強制UIKit在某些設備上使用標準(不是@ 2x)圖像,即使@ 2x圖像可用時也是如此?

我希望能夠通過強制UIKit使用iPod Touch(內存少於等效iPhone)來減少內存使用量標準分辨率圖像(如果設備是帶有視網膜顯示器的iPod Touch)。我可以在cocos2d中設置一個標誌強制加載SD圖像,但是我還沒有找到類似的選項或UIKit的解決方法。

所以總結一下,該項目是一個通用二進制已在SD和視網膜口味的所有圖像,像這樣:

image.png

[email protected]

在iPhone 4,4S和5(均帶有視網膜顯示器),則需要加載圖像的@ 2x版本的默認UIKit行爲。

在iPod Touch第4代(也可能是第5代)我想強制UIKit加載SD image.png文件,即使也有[email protected]文件。

這是爲了減少這些具有視網膜顯示的設備的內存佔用量,但是RAM的一半是手機。

如果任何人有任何想法或解決方法來實現這一點,我真的很感激它!

+1

您可能需要創建自己的方法來獲取基於設備的圖像。在這種情況下,你不應該用@ 2x命名圖像。您的方法應該根據設備和視網膜顯示獲取圖像,並返回可用於創建UIImage對象的圖像的名稱。此方法可以是UIImage上添加的類別。 – iDev

+0

iPod 5的內存與iPhone 4和4s的內存一樣,512 MB。 iPod 4是您*可能需要擔心的唯一設備,它有256 MB。如果你有足夠的圖像數據,你擔心你的內存佔用256 MB的,你可能想重新處理你的圖像數據。 – msgambel

回答

2

添加作爲一個答案我的意見,

您可能需要創建自己的方法來獲取基於設備的圖像。在這種情況下,你不應該用@ 2x命名圖像。您的方法應根據設備和視網膜顯示獲取圖像,並返回可用於創建對象的圖像名稱。此方法可以是UIImage上添加的類別。

對於例如: -

[UIImage testImageNamed:@"test.png"]; 

和實施testImageNamed方法如UIImage基於設備和視網膜/非視網膜分辨率返回testRetina.pngtest.png類別。

更新: 或者,你也可以用這一類適用於iPod touch設備的以下嘗試,以便您可以跟上@ 2倍的圖像本身(test.png和[email protected])。我不確定這是否會起作用。我假設,如果fileName只有「測試」,這可能會獲取test.png本身,但我沒有嘗試過。這絕對值得一試。

NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension]; 
NSData *imageData = [NSData dataWithContentsOfFile:fileLocation]; 
[UIImage imageWithData:imageData]; 

添加上述只爲iPod touch和其他設備可以返回正常[self imageNamed:@"test.png"];

1

我認爲你可以做的最好的做法是在iPod上加載不同的圖像,這樣可以保證不存在@ 2x版本。這樣你可以節省內存,但實際上應用程序會因圖像重複而變得更重......

希望它有幫助!再見!

+0

感謝Ricard ......你知道有一種方法可以做到嗎?我不知道有什麼方法可以在App Store上編譯一個版本的應用程序,並將其定位到iPod Touches,併爲iPhones編譯另一個版本的應用程序。你知道有一種方法可以做到嗎? –

+0

您可以創建Rich86man提到的某種類別,檢查當前設備是否爲iPod,如果是這種情況,請嘗試通過調用imageNamed與後綴-iPod(或類似的東西)拍攝圖像:新的字符串名稱。如果該圖像不存在,或者該設備不是iPod,則只需使用原始名稱調用imageNamed:即可。 –

-1

我會寫一個類上的UIImage有一個名爲像

功能

myImageNamed:(的NSString *)名稱

然後使用的UIDevice來確定當前的設備和搜索捆綁的圖像,你會喜歡使用。

這將是這個樣子:

- (UIImage*)myImageNamed:(NSString*)name 
{ 
    if (!notIpodTouch) { 
     return [self imageNamed:name]; 
    } 

    //search through mainBundle for file with passed in name 
    //return that 

} 
+0

感謝Rich86man。即使我按照您所描述的方式創建了一個類別,我也不會在某個時候使用內置的UIImage加載方法和我的標準res文件的名稱,例如image.png?如果[email protected]存在,UIImage會不會自動獲取?棘手的是,我們需要使用image.png和[email protected]命名方案來支持iPhone和較舊的iPod Touch上的標準視網膜處理。如果我使用上面的類別方法,我最終需要爲iPod Touches加載不同的文件名,對嗎?這將意味着包括冗餘資產:( –