0

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

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))];
    }
}
4

1 回答 1

1

几个想法:

  1. 我很惊讶你看到口吃,你真的没有看到任何与 0.0155-0.017s 间隔的偏差。我会仔细检查一下。我希望对于每个口吃,你会看到一个次优的间隔。

  2. 在运行循环上调度某些内容时,您可能会考虑使用NSRunLoopCommonModes,它比NSDefaultRunLoopMode. 根据您正在进行的其他操作,这可能会影响性能。

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

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

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

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

于 2014-02-27T17:57:42.980 回答