繁体   English   中英

我的UIView动画生涩 - 如何优化以下代码?

[英]My UIView animation is jerky - how can I optimize the following code?

在模拟器上,我的动画方法运行顺畅。 不幸的是,它似乎在iPhone 4上非常生涩。

我不是100%确定最好和最快的动画制作方法 - 所以任何有关如何优化或完全修改我的代码以加快动画的提示都将非常感激!

笔记:

它已经在主线程上,所以这使得'dispatch_async(dispatch_get_main_queue())'调用无关紧要或无益吗?

有没有办法预先缓冲这个动画?

有没有办法确切地看到代码的哪个部分正在减速​​?

extensionView.subviews中只有大约3或4个视图。

我用-Os编译了。

- (void)extendWithAnimation:(BOOL)animated; {

    isExtended = YES;
    extensionView.hidden = NO;
    topShadowView.hidden = NO;

    topShadowView.frame = CGRectMake(0, defaultHeight, topShadowView.frame.size.width, topShadowView.frame.size.height);
    topShadowView.layer.bounds = CGRectMake(0, 0, topShadowView.frame.size.width, 0);
    extensionView.frame = CGRectMake(0, defaultHeight - 8, DEVICE_WIDTH, extensionHeight + 8);
    extensionView.layer.bounds = CGRectMake(0, 0, DEVICE_WIDTH, 0);

    for (UIView *view in extensionView.subviews) {
        view.transform = CGAffineTransformMakeTranslation(0, -(extensionHeight+8));
    }

    dispatch_async(dispatch_get_main_queue(), ^{

        if (animated) {
            [UIView beginAnimations:nil context:nil];
            [UIView setAnimationDuration:0.3];
            [UIView setAnimationDelegate:self];
        }

        extensionView.layer.bounds = CGRectMake(0, 0, DEVICE_WIDTH, extensionHeight + 8);
        topShadowView.layer.bounds = CGRectMake(0, 0, topShadowView.frame.size.width, extensionHeight + 8);

        for (UIView *view in extensionView.subviews) {
            view.transform = CGAffineTransformIdentity;
        }

        if (animated) {
            [UIView commitAnimations];
        }
    });   
}

解:

解决了(谢谢亚伦!)。

渲染阴影杀死动画很大的时间! 如果您计划制作动画,请不要使用任何核心图形阴影属性 - 在我的情况下,只有几个阴影会将帧速率降低三倍。

  1. 好吧,如果代码已经在主队列中,那么使用dispatch_async只会产生开销。
  2. 我不知道这是否会有所帮助(我有点怀疑),但您可以尝试使用[UIView animateWithDuration:.3 animations:{ code... }];
  3. 在我过去尝试处理阴影时,他们往往会有很大的性能影响力。 您可以考虑单独留下阴影和图层,而是创建一个可调整大小的阴影PNG,您可以在放置在您想要阴影的视图后面的UIImageView中使用它。

通过Instruments运行代码(从Time Profiler开始)。 什么电话在动画期间占用的时间最多?

一旦您对其进行了分析,也可以通过Core Animation工具运行它,并启用屏幕外渲染和非不透明内容的着色。 这有助于隔离常见的图形问题。

我也注意到你提到了阴影。 如果您使用的是CALayer阴影属性,则可能会导致性能下降。 但我们需要更多的信息来真正解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM