【问题标题】:Stuttering animation whilst using CADisplayLink使用 CADisplayLink 时出现口吃动画
【发布时间】:2014-02-27 17:17:59
【问题描述】:

我正在尝试使用CADisplayLink 调用MoveObjects 函数来为一些UIImageViews 设置动画以“跌倒”页面。然而,尽管函数调用的间隔是一致的 0.0155-0.017 秒,但动画似乎每隔几帧就会断断续续,就像我尝试使用 NSTimer 调用函数时一样。是不是我做错了什么,导致口吃?

viewDidLoad:

displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(gameLoop)];
displayLink.frameInterval=1;
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

当前 gameloop pnly 调用 UpdateObjects:

-(void)updateObjects{
    timeStamp=[displayLink timestamp];
    double frameTime=timeStamp-oldTime;
    oldTime= timeStamp;
    if (frameTime>10){
        frameTime=0;
    }
    NSLog(@"%f",frameTime);

    for (int i=0; i<objectsArray.count; i+=1) {
        UIImageView *currentObject=[objectsArray objectAtIndex:i];
        CGRect currentObjectFrame=[currentObject frame];
        [currentObject setFrame:CGRectMake(CGRectGetMinX(currentObjectFrame), CGRectGetMinY(currentObjectFrame)+200*frameTime,CGRectGetWidth(currentObjectFrame) , CGRectGetHeight(currentObjectFrame))];
    }
}

【问题讨论】:

  • 有什么理由不使用CAAnimationUIKitDynamics 进行秋季运动?

标签: ios objective-c cadisplaylink


【解决方案1】:

一些想法:

  1. 我很惊讶您看到口吃,您实际上没有看到与 0.0155-0.017 秒间隔的任何偏差。我会仔细检查一下。我希望对于每次口吃,您都会看到次优间隔。

  2. 在运行循环中调度某些内容时,您可能会考虑使用NSRunLoopCommonModes,它比NSDefaultRunLoopMode 更广泛一些。这可能会影响性能。

  3. 我认为这不是问题,但是在计算浮点值时,您应该小心包含整数表达式(例如 200,而不是 200.0f),因为有时隐式转换会导致奇怪的舍入问题,如果计算手动动画的屏幕坐标可能会导致动画中出现奇怪的不连续性。

  4. 就一般图像动画问题而言,以下任何一种情况都可能导致响应时间欠佳:使用具有透明度值的图像;需要调整大小以在图像视图中显示的图像;使用任何图层效果,尤其是基于贝塞尔的阴影;图像数量过多;等等。

  5. 显然,我希望您是在物理设备而不是模拟器上进行测试,因为模拟器不能准确反映实际设备的图形性能。

尽管如此,我很难调和这样一个事实,即您看到的口吃与您从未看到大于 0.017 秒的间隔的说法。如果是这种情况,那将导致我怀疑一些与舍入相关的问题(在 CGRect 值帧到帧中引入一些不连续性),但我在这里看不到任何此类问题。

【讨论】:

  • 感谢您的建议,非常有用。我发现调用的时间间隔(调用“moveObjects”的时间间隔)确实最高可达 0.0176 秒,但答案可能在 5 号(对不起)中。我认为我还没有办法在物理设备上运行它,所以我会将这个答案标记为已回答,我只希望这是一个模拟器问题。再次感谢,五分。
  • 这不是一个解决方案,但第 3 点帮助我改进了项目中的其他几个方面。
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
相关资源
最近更新 更多