3

我正在开发一个使用大量详细图形的项目。由于始终显示的精灵、背景等的数量,它具有很大的内存占用。我们将 cocos2D 用于动画和精灵,将 UIKit 用于 UI、菜单等。

如果设备是带有视网膜显示屏的 iPod Touch,我希望能够通过强制 UIKit 使用标准分辨率图像来减少 iPod Touch 上的内存使用(它的内存比同等 iPhone 少)。我可以在 cocos2d 中设置一个标志来强制加载 SD 图像,但我还没有为 UIKit 找到类似的选项或解决方法。

总而言之,该项目是一个通用二进制文件,其中包含 SD 和视网膜风格的所有图像,如下所示:

图像.png

图片@2x.png

在 iPhone 4、4S 和 5(都带有视网膜显示器)上,需要加载 @2x 版本图像的默认 UIKit 行为。

在 iPod Touch 第 4 代(可能还有第 5 代)上,我想强制 UIKit 加载 SD image.png 文件,即使还有可用的 image@2x.png 文件。

这是为了减少这些具有视网膜显示器的设备上的内存占用,但内存只有手机的一半。

如果有人有任何想法或解决方法来实现这一点,我将不胜感激!

4

3 回答 3

2

添加我的评论作为答案,

您可能必须创建自己的方法来根据设备获取图像。在这种情况下,您不应该使用 @2x 命名图像。您的方法应该基于设备和视网膜显示获取图像,并返回可用于创建UIImage对象的图像名称。这个方法可以在一个类上添加UIImage

例如:-

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

并将方法实现为返回或基于设备和视网膜/非视网膜分辨率testImageNamed的类别。UIImagetestRetina.pngtest.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"];

于 2012-11-16T23:55:07.517 回答
1

我认为你能做的最好的就是在 iPod 上加载不同的图像,这样你就可以保证不存在 @2x 版本。这样你可以节省内存,但实际上应用程序会因为图像重复而变得更重......

希望能帮助到你!再见!

于 2012-11-16T23:25:06.833 回答
-1

我会在 UIImage 上写一个类别,其名称类似于

myImageNamed:(NSString*)name

然后使用 UIDevice 来确定当前设备并在你的包中搜索你想要使用的图像。

它看起来像这样:

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

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

}
于 2012-11-16T23:36:20.613 回答