【问题标题】:Is there a more performant way of animating an image sequence?是否有更高效的方式来为图像序列设置动画?
【发布时间】:2009-09-18 00:10:45
【问题描述】:

我担心这是邪恶的代码:

CGRect iRect = CGRectMake(0.0f, 0.0f, 320.0f, 400.0f);
UIImageView *imgView = [[UIImageView alloc] initWithFrame:iRect];
imgView.animationImages = [NSArray arrayWithObjects:
                [UIImage imageNamed:@"b0001.png"],
                [UIImage imageNamed:@"b0002.png"],
                // 150 more
                [UIImage imageNamed:@"b0152.png"],
                nil];

我稍微记得 imageNamed: 是邪恶的。如果我这样做,并且我必须提供 UIImage 对象,那么那些 UIImage 对象会立即将这些图像文件加载到内存中,对吗?而且,除此之外,所有这 152 个厚实的 UIImage 对象都会在内存中占用很大的内存,因为它们是自动释放的,不是吗?

总之,使用这种技术很糟糕。可以?我不知道。在我古老的第一代 iPod touch 上,这似乎以 25 fps 的速度运行,没有任何延迟。非常光滑和漂亮。我唯一担心的是其他一些设备可能对此有不同的看法。虽然我有最弱的可编程 ipod touch。

无论如何,有人认为那里有任何改进的可能性吗?还是我不应该使用它并在自己的算法中使用 UIImageView 的 setImage: ,该算法将使用该厚实的 imageWithContentsOfFile 事物(可能命名不同)加载和设置具有延迟选择器的那些图像,而无需自动释放?也许某个聪明人为包含图像序列的高性能拇指视频编写了一个小库?

(不,视频在 iphone 上不是一个选项;苹果框架只支持全屏,我不知道还有什么可以做到的)

【问题讨论】:

    标签: iphone cocoa-touch video uikit uiimageview


    【解决方案1】:

    您对 imageNamed 的看法是正确的...在许多情况下您不应该使用它,因为它会在内部缓存图像。使用:

    [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image1" ofType:@"png"];
    

    你想使用 imageNamed 的唯一时间是什么时候

    1) 您一遍又一遍地重复使用一个图标(tableviews 等...)
    2)你还没有实现your own caching system

    【讨论】:

    • (1) 在 3.0 软件中,+[UIImage imageNamed:] 如果收到内存不足警告,则会释放缓存的图像。 (2) 即使它确实永久缓存,只有当您不希望图像在您的应用程序的整个生命周期内都存在时才重要。因此,虽然您提供的技术很好,但 +[UIImage imageNamed:] 也是如此。这不是邪恶的。
    • 你应该把这个作为答案。
    【解决方案2】:

    我不会尝试将这么多图像加载到 UIImageView 数组中。一个类似的问题是asked here。我在那里描述的缓冲方法也应该适用于您的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 2015-01-17
      相关资源
      最近更新 更多