Results 1 to 2 of 2
  1. #1

    Member Since
    Feb 21, 2012
    Question Core Animation: Animations not smooth and judder/shudder - Help required
    I am new to IOS development, and will be grateful for any help.

    I'm currently working with Core Animation. I have noticed that when I have several animations (either CABasicAnimation or CAKeyFrameAnimation) animating at the same time they judder and the layers become blurry. The more animations there are, animating simultaneously, the worse this problem is. Everything works fine in the IOS simulator on an iMac, the problem occurs when I test it on an iPhone.

    I am using CALayer to create many layers then adding animations to those layers.

    Here is a snippet of the code:

    - (void) doAnimation

    // Rotate shape about z axis
    CABasicAnimation *rotation;
    rotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotation.duration = 10.0;
    rotation.beginTime = CACurrentMediaTime();
    [rotation setToValueNSNumber numberWithFloat:32]];

    //Blue Square
    CALayer *squareLayer = [CALayer layer];
    squareLayer.backgroundColor = [UIColor blueColor].CGColor;
    squareLayer.shadowOffset = CGSizeMake(0, 3);
    squareLayer.shadowRadius = 5.0;
    squareLayer.shadowColor = [UIColor blackColor].CGColor;
    squareLayer.shadowOpacity = 0.8;
    squareLayer.frame = CGRectMake(-70, 50, 50, 50);

    // Move Blue Square
    CABasicAnimation *animation1;
    animation1 = [CABasicAnimation animationWithKeyPath:@"position"];

    animation1.fromValue = [NSValue valueWithCGPoint:CGPointMake(-80, 50)];
    animation1.toValue = [NSValue valueWithCGPoint:CGPointMake(400, 50)];
    animation1.duration = 4.0;
    animation1.beginTime = CACurrentMediaTime();

    //Add squareLayer to the view
    [self.view.layer addSublayer:squareLayer];

    //Add animations to squareLayer
    [squareLayer addAnimation:rotation forKey:@"transform"];
    [squareLayer addAnimation:animation1 forKey:@"position"];

    //Create a UIBezierPath for a Triangle
    UIGraphicsBeginImageContextWithOptions(CGSizeMake( 200,200), NO, 0);

    UIBezierPath *trianglePath = [UIBezierPath bezierPath];

    [trianglePath moveToPoint:CGPointMake(100, 25)];
    [trianglePath addLineToPoint:CGPointMake(165, 137.58)];
    [trianglePath addLineToPoint:CGPointMake(35, 137.58)];
    [trianglePath closePath];

    //Fill the UIBezierPath with a color
    [[UIColor magentaColor]setFill];
    [trianglePath fill];

    //Create a UIImage using the current context.
    UIImage *triangle = UIGraphicsGetImageFromCurrentImageContext();

    //Create a layer for triangle, use the UIImage triangle
    CALayer *triangleLayer = [CALayer layer];
    triangleLayer.frame = CGRectMake(-100, 150, 100, 100);
    triangleLayer.contents = (id)triangle.CGImage;

    triangleLayer.shadowOffset = CGSizeMake(0,3);
    triangleLayer.shadowRadius = 5.0;
    triangleLayer.shadowColor = [UIColor blackColor].CGColor;
    triangleLayer.shadowOpacity = 0.8;

    //Move Triangle Animation
    CABasicAnimation *animation2;
    animation2 = [CABasicAnimation animationWithKeyPath:@"position"];
    animation2.fromValue = [NSValue valueWithCGPoint:CGPointMake(-100, 150)];
    animation2.toValue = [NSValue valueWithCGPoint:CGPointMake(400, 150)];
    animation2.duration = 4.0;
    animation2.beginTime = CACurrentMediaTime();

    //Add triangleLayer to the view
    [self.view.layer addSublayer:triangleLayer];

    //Add animations to triangleLayer
    [triangleLayer addAnimation:rotation forKey:@"transform"];
    [triangleLayer addAnimation:animation2 forKey:@"position"];


    As you can see, there is a squareLayer and a triangleLayer to which I add animations. If I set the animations to animate one after the other i.e.
    animation2.begintime = CACurrentMediaTime() + 5.0; the animations are very smooth - but if the animations remain as they are coded above (animating simultaneously), they are no longer smooth - and judder. As I said, the problem is on the iPhone itself not on the IOS simulator on a Mac. It gets worse as I add more animations to the doAnimation method.

    Any advice will be appreciated.

  2. #2

    Mark FX's Avatar
    Member Since
    Aug 13, 2011
    West Sussex, UK
    I hav'nt done to much work with Core Animation myself, but I would start out saying that
    the iOS operating system will never be able to perform as quickly as the Mac, it has a lot
    slower processor, and a lot less RAM and Graphics performance.

    After a quick through the documentation I did see that the CAAnimationGroup class might
    help with your performance problem, but I cant promise this.
    You use it by adding all of your CABasicAnimations to CAAnimation Group object like this.

    CABasicAnimation *mover = [CABasicAnimation animationWithKeyPath: @"position"];
    [mover setDuration:1.0];
    [mover setFromValue:[NSValue valueWithCGPoint: CGPointMake(0.0, 100.0)]];
    [mover setToValue:[NSValue valueWithCGPoint: CGPointMake(100.0, 100.0)]];
    CABasicAnimation *fader = [CABasicAnimation animationWithKeyPath: @"opacity"];
    [mover setDuration:1.0];
    [mover setFromValue:[NSNumber numberWithFloat: 1.0]];
    [mover setToValue:[NSNumber numberWithFloat: 1.0]];
    CAAnimationGroup *group = [CAAnimationGroup animation];
    [group setAnimations: [NSArray arrayWithObjects: mover, fader, nil]];
    [[[self view] layer] addSubLayer: group];
    This example code does not do anything, because I have not created any objects to animate, but it serves only to show how to use the CAAnimationGroup class.
    Not sure this class will help performance, as I have not tested it on an iOS device.,
    but might be worth trying.

    The only other thing worth try is to run the different animations in seperate threads, but this
    is not always advised with iOS devices, where limited system resources are available.

    Not sure if this helps much, but good luck with it.

    Regards Mark

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. DVD's not smooth at all on 8-core Mac Pro
    By The_Pro in forum Apple Desktops
    Replies: 9
    Last Post: 02-06-2011, 04:41 PM
  2. Is there a way to turn off some Core Image stuff or animations
    By hal515 in forum OS X - Operating System
    Replies: 1
    Last Post: 02-12-2008, 11:25 PM
  3. How do I install and access Core Animation on Leopard?
    By Artmuzz in forum OS X - Operating System
    Replies: 2
    Last Post: 10-30-2007, 03:00 PM
  4. Core Animation on GMA950
    By redwagon76 in forum Apple Notebooks
    Replies: 0
    Last Post: 08-08-2007, 04:03 AM
  5. Leopard & Core Animation
    By MikeYMS in forum Apple Rumors and Reports
    Replies: 3
    Last Post: 06-08-2007, 07:36 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts