CADisplayLink running lower frame rate on iOS5.1

后端 未结 3 476
南笙
南笙 2021-02-04 19:32

I\'m using CADisplayLink in my iPhone app.

Here is the relevant code:

SMPTELink = [CADisplayLink displayLinkWithTarget:self selector:@selec         


        
3条回答
  •  春和景丽
    2021-02-04 20:08

    Rob's answer is exactly right. You've no business worrying about the frame rate of CADisplayLink; in fact, you mustn't even expect that the timer will fire with anything like regularity. Your job is to divide up the desired animation in accordance with the desired time scale, and draw the frame you actually get each time the timer fires by adding up the accumulated timestamps.

    Here is sample code from my book:

    if (self->_timestamp < 0.01) { // pick up and store first timestamp
        self->_timestamp = sender.timestamp;
        self->_frame = 0.0;
    } else { // calculate frame
        self->_frame = sender.timestamp - self->_timestamp;
    }
    sender.paused = YES; // defend against frame loss
    
    [_tran setValue:@(self->_frame) forKey:@"inputTime"];
    CGImageRef moi3 = [self->_con createCGImage:_tran.outputImage
                                       fromRect:_moiextent];
    self->_iv.image = [UIImage imageWithCGImage:moi3];
    CGImageRelease(moi3);
    
    if (self->_frame > 1.0) {
        [sender invalidate];
        self->_frame = 0.0;
        self->_timestamp = 0.0;
    }
    sender.paused = NO;
    

    In that code, the _frame value runs between 0 (we are just starting the animation) and 1 (we have finished the animation), and in the middle I just do whatever this particular situation requires to draw that frame. To make the animation take longer or shorter, just multiply a scale factor when setting the _frame ivar.

    Also note that you must never test in the Simulator, as the results are utterly meaningless. Only the device runs CADisplayLink properly.

    (Example comes from here: http://www.apeth.com/iOSBook/ch17.html#_cifilter_transitions)

提交回复
热议问题