我正在开发一个使用大量详细图形的项目。由于随时显示的精灵,背景等数量,它具有大的内存占用。我们使用cocos2D作为动画和精灵,使用UIKit作为UI,菜单等。
如果设备是带有视网膜显示屏的iPod Touch,我希望能够通过强制UIKit使用标准分辨率图像来减少iPod Touch上的内存使用量(内存比同等iPhone更少)。我可以在cocos2d中设置一个标记SD图像的强制加载,但是我还没有为UIKit找到类似的选项或解决方法。
总而言之,该项目是一个通用二进制文件,包含SD和视网膜风格的所有图像,如下所示:
image.png
image@2x.png
在iPhone 4,4S和5(均带有视网膜显示屏)上,需要加载@ 2x版本图像的默认UIKit行为。
在iPod Touch第4代(可能是第5代)我想强制UIKit加载SD image.png文件,即使有image@2x.png文件也可用。
这是为了减少这些具有视网膜显示器的设备的内存占用量,但是这些设备的RAM是手机的一半。
如果有人有任何想法或解决方法来实现这一点,我真的很感激!
答案 0 :(得分:2)
添加我的评论作为答案,
您可能必须创建自己的方法来根据设备获取图像。在这种情况下,您不应该使用@ 2x命名图像。您的方法应该根据设备和视网膜显示获取图像,并返回可用于创建UIImage
个对象的图像名称。此方法可以是UIImage
上添加的类别。
例如: -
[UIImage testImageNamed:@"test.png"];
并将testImageNamed
方法实现为UIImage
中的一个类别,该类别根据设备和视网膜/非视网膜分辨率返回testRetina.png
或test.png
。
<强>更新强> 或者,您也可以尝试使用以下类别的iPod touch设备,以便您可以使用@ 2x本身保存图像(test.png和test@2x.png)。我不确定这是否有效。我假设如果fileName只有“test”,这可能会获取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 :(得分:1)
我认为您可以做的最好的事情是在iPod上加载不同的图像,这样您就可以保证不存在@ 2x版本。这样你就可以节省RAM,但实际上由于图像重复,应用程序会更重......
希望它有所帮助!见到你!
答案 2 :(得分:-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
}