1

我正在制作一个有胜利状态和失败状态的游戏。对于每个状态,我想显示一个 2-3 秒的短动画。第一个动画包含 60 个 PNG,速率为 30 fps,第二个动画包含 80 个 PNG,同样为 30 fps。我尝试了各种方法,并广泛搜索了解决方案,但我一直发现的前两个结果是使用 UIImageView 动画图像和核心动画。在模拟器中使用 UIImageView 效果很好,但第一次在设备上运行需要很长时间。我认为这是因为图像需要加载到内存中。我正在使用“imageNamed”来填充animationImages数组,但我猜他们需要在第一次调用动画时渲染?我已经尝试在应用程序加载时预渲染它们,这似乎可以解决问题,但是预渲染所有这些图像需要将近 10 秒,这对用户不友好。我也愿意使用 Core Animation,但我对它的了解非常有限,因此非常感谢详细的解释。谢谢!

当您说我需要在应用程序启动时加载所有内容时,您到底是什么意思?现在,我在应用加载时初始化两个动画图像数组,如下所示:

// Create thinnestAnimation Array
thinnestAnimation = [[NSMutableArray alloc] init];
for(int i = 1; i <= 60; i++)
{
    UIImage *thinImage = [UIImage imageNamed:[NSString stringWithFormat:@"ThinnestJump_%d.png", i]];
    [thinnestAnimation addObject:thinImage];
}

thinAnimationImageView.animationImages = (NSArray *)thinnestAnimation;
thinAnimationImageView.animationDuration = 2.0;
thinAnimationImageView.animationRepeatCount = 1;

thinAnimationImageView 是我界面中的一个 IBOutlet,[thinAnimationImageView startAnimating];当我想要为图像序列设置动画时我会调用它。这严重滞后于第一次通话,但此后很好。有没有办法防止它第一次滞后?

4

4 回答 4

1

UIImageView的内置动画功能是一个很好的方法。但是,您需要在需要制作动画之前加载所有内容,例如在应用程序启动时。如果您需要准备好多个不同的动画,请在启动时加载多个 UIImageView 对象,然后使用它的startAnimating方法调用您稍后需要的那个。

还有其他动画方法,例如使用 Cocos2D,它使用 OpenGL 进行动画,性能更快。但是你已经在一个完全不同的框架中构建了你的应用程序,这可能是过度的,这取决于你的应用程序中发生的其他事情。

于 2012-08-13T06:21:55.650 回答
1

正如安德鲁斯所提到的,UIImageView 具有动画的内置属性

就像你有一个图像数组(imgarray)和一个图像视图

用于创建图像数组

NSMutableArray *imgarray = [NSMutableArray arrayWithCapacity:100]
for (int i = 0; i < 100; ++i) {
  NSString *name = [NSString stringWithFormat:@"img%d.png",i];
  UIImage *image = [UIImage imageNamed:name];
  [imgarray addObject:image];
}

然后用于动画

UIImageView *imgview;

imgview.animationimages=imgarray;

然后设置

 imgview.animationDuration=2.0;  //in seconds

     [imgview startAnimating];

stopanimating 用于停止动画,还有一个用于动画重复计数的属性

希望这可以帮助.....

于 2012-08-13T07:08:28.770 回答
0

您可能想查看这篇关于使用 CALayer 使用 sprite sheet 制作动画的文章。图层的开销与 spritesheet 一样少。

于 2012-12-21T17:55:28.423 回答
0

迟到的答案,但我自己处理了这个问题,发现以下有用:

第三个答案的底部,依次使用图像数组的动画

基本上,使用 imageNamed: 比直接从包中提取图像要慢。这是我所做的使我的加载速度更快的方法:

NSMutableArray *imagesArray = [NSMutableArray new];

for (int i = 0; i < 150; i++)
{
    [imagesArray addObject:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"pngSlice-%d", i]
                                                                                            ofType:@"png"]]];
}

self.myImageView.animationImages = imagesArray;
self.myImageView.animationRepeatCount = 1;
self.myImageView.animationDuration = 2.5;

[self.myImageView startAnimating];

imagesArray = nil;

如果您将图像直接添加到包中并按顺序命名它们(即 pngSlice-0、pngSlice-1、pngSlice-2...),则此方法有效。我有 150 张图片,更改条件以匹配您的图片总数。

于 2017-02-07T18:35:04.743 回答