2009-12-01 44 views
2

我正在编写一个相当基本的应用程序。它使用最少的触摸输入,并且大多只是播放花哨的动画。没有太多的动画,但它目前做的方式似乎超级低效,并使用太多的内存。iPhone动画效率解决方案,分层问题

该视图分为两部分,底部的1/5只是一个永远不会改变的图像。其余部分是动画播放的地方。目前通过将32个图像加载到一个数组中,然后通过它们播放(8fps)来完成。它通过每个动画共进行4次。图片不是很大,但它们还是很大。我还想知道存储它们的最佳文件格式,无论是在整体大小还是所需的开销方面。

这是一个超级简单的方法,它的工作原理,但它似乎并没有削减它memwise,它使用太多。

我的建议是,建立分类动画为若干层,因为有几件事情,我认为可以做不同的:

  • 使背景一个静态图像,所以它并没有成为一部分的动画
  • 取出一些“装饰物”,例如移动图形和进度条,并在动画的顶部或下方制作自己的部分透明图层。就我未来的创作自由而言,这也将打开大门。
  • 剪出顶部的文字,并使用iPhone以编程方式显示文字。使用iPhone绘制文本或加载带有文本的图像会更好吗?主要是Web Dev,我觉得加载任何带有文本的图像是很愚蠢的。
  • 在将这些内容剪切为动画时将剩下的内容播放出去,而这些内容会显着缩小。

总的来说,我们正在寻找1个静态背景,3-5个小动画和一个大型动画。我是否可以使用图层将这些元素全部分开,并更多地依靠iPhone来绘制最终图像?那是我认为我可以让它运行得更好一点的地方,将所有内容合并成一张翻页幻灯片的大图似乎很愚蠢,但您可以加载一些在应用程序范围内使用的较小的元素,并且更有效地做事情。

或者,我是否完全过分复杂,有没有更好的方法去做呢?

编辑:我一直在浏览,看来使用图层会更有效率。不过,我也有另外一个问题。将动画的每一帧作为自己的文件并加载到数组中以获得动画,或者让所有帧都有一个巨大的精灵图表图像,并让iPhone从精灵图表中使用坐标编程?

编辑2:我们一直以来努力的一切了,check it out on the App store.

回答

0

这是我用来解决问题的极早期版本。我很清楚,这并不是什么接近理想的东西,但它是有效的。如果你觉得你需要更好地写出这些,那么一定要这样做。我会尽力记住稍后再回来发布更新。

这个计时器失去了0.1秒的准备时间,所以如果你把它设置为28fps,图像渲染速度为28fps,它会丢帧,但相当不明显。

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"VDL"); 
    [animationFrame initWithInteger:1]; 
    [self animation]; 
    NSLog(@"VDL Completed"); 
} 

- (void)animation { 
    CGRect animationRect = CGRectMake(0, 0, 320, 384); 
    //NSLog(@"animationRect defined"); 
    animationImages = [[UIImageView alloc] initWithFrame:animationRect]; 
    [self.view addSubview:animationImages]; 
    //NSLog(@"animationImages allocated, init'd"); 
    animationTimer = [NSTimer scheduledTimerWithTimeInterval:0.0357 target: self selector:@selector(blah) userInfo:nil repeats:YES]; 
    [animationImages setImage:[UIImage imageNamed:[NSString stringWithFormat:@"SCAN%d.jpg", animationFrame]]]; 
    //NSLog(@"animationTimer started"); 
    animationTimer = nil; 
    //NSLog(@"animationTimer set to nil"); 
} 

- (void)blah { 
    if (animationFrame <= 336){ 
     animationFrame += 1; 
     [animationImages setImage:[UIImage imageNamed:[NSString stringWithFormat:@"SCAN%d.jpg", animationFrame]]]; 
     NSLog(@"%d", animationFrame); 
    } 
    else { 
     animationFrame = 1; 
     NSLog(@"restart"); 
    } 
} 
1

假设总的动画序列是静态的,你是最好的办法是编译成电影,并使用视频播放器框架播放:

MPMoviePlayerController 

这将允许iPhone使用自定义硬件的显示器,并将保持电池使用率低。作为用户交互,你只需要设置movieControlMode属性来防止用户能够与电影互动:

MPMovieControlModeHidden不要 显示任何控件。此模式 可防止用户控制 播放。

适用于iPhone OS 2.0及更高版本。

在MPMoviePlayerController.h中声明。

+0

是否允许用户控制视频的播放?我们不希望这种情况发生。 – Sneakyness 2009-12-01 16:31:23

+1

完全不是,您可以选择是否显示用户控件 – 2009-12-01 16:56:06

+0

从文档中可以看出,它仅允许全屏幕电影?我需要电影播放不全屏。 – Sneakyness 2009-12-01 19:16:25