代码之家  ›  专栏  ›  技术社区  ›  Brandon Schlenker

更快的iPhone PNG动画

  •  4
  • Brandon Schlenker  · 技术社区  · 14 年前

    目前,我有一个PNG动画的计时器是每.01秒发射一次。但是,性能并不是最佳的,而且动画明显很慢。我有2000多张照片。有没有更好的方法来实现这一点?我在下面发布了一些与我的方法类似的东西。

    timer_ = [NSTimer scheduledTimerWithTimeInterval:.01 target:self
    selector:@selector(switchImage) userInfo:nil repeats:YES];
    
    
    -(void)switchImage 
    {
       p = [p stringByAppendingFormat:@"/Movie Clipping 1 000%i.png",i];
       imageView_.image = [UIImage imageWithContentsOfFile:p];
       i = i++;
    }
    
    3 回复  |  直到 12 年前
        1
  •  7
  •   Fattie    14 年前

    确切的尺寸

    我们在这方面做了很多工作,在pad上播放动画没有问题,比如说500x500。所以我想知道,谢谢。

    一个直接的问题是

    那是绝对不可能的。没有东西能以每秒100帧的速度运行。20fps是“极其平滑”,30fps是“惊人平滑”,40fps是“令人难以置信的人类视觉研究水平的平滑,如果它可以实现”和100 fps无法实现。

    普通的环境会很快为您加载帧。

    所以先回到每秒30帧 (最多!)扔掉第二和第三张图片,这样动画看起来就一样了。即,在代码行中,“i=i++”变为“i++=3”。

    下一个问题!如果你真的像这样加载每个图像,你几乎肯定需要 在飞行中释放他们

    [happy.image release];
    happy.image = [[UIImage alloc] initWithContentsOfFile:
        [[NSBundle mainBundle] pathForResource:@"blah" ofType:@"png"]];
    

    如果你不这样做,那就行不通了。

    #define BI(X) [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@X ofType:@"tif"]]
    
        happyDays  = [[NSArray alloc] initWithObjects:
                BI("hh00"), BI("hh01"), BI("hh02"), BI("hh03"), BI("hh04"), BI("hh05"), BI("hh06"), BI("hh07"), BI("hh08"), BI("hh09"), 
                BI("hh10"), BI("hh11"), BI("hh12"), BI("hh13"), BI("hh14"), BI("hh15"), BI("hh16"), BI("hh17"), BI("hh18"), BI("hh19"), etc etc etc
                nil];
    
        animArea.animationImages = happyDays;
        animArea.animationDuration = 2.88;
        // that is overall seconds. hence: frames divided by about 30 or 20.
        [animArea startAnimating];
    

    不适合你的情况?

    总之,你的问题是每秒100帧。换成每秒20帧,你就不会有麻烦了。

        2
  •  1
  •   AechoLiu    14 年前

    怎么样 CADisplayLink 管理fps?

    OpenGLES需要花费时间将图像转换为纹理,而纹理需要仔细的内存管理。当内存不足时,它将生成一个完整的白色纹理。

        3
  •  -1
  •   Daniel A. White    14 年前

    将动画编码为视频并播放该视频。