0

我对 nstimer 和 ui update 和 drawrect 有一些问题,我有一个 viewcontroller 并在里面放了一个计时器,它每 0.02 秒运行一次,在这个计时器滴答功能中,我让一个 imageview 从上到下移动(更改视图中心),然后添加另一个视图,当在这个视图上触摸开始触摸移动和触摸结束时,画一条线并调用setneedsdisplay,当我的手指在视图上移动时,我之前提到的imageview移动得更慢,通过检查时间滴答,我发现,没有手指,它滴答作响 0.02 秒,但是当继续移动时,它减慢到 0.1 秒,这使得图像视图移动更慢,任何其他优化它的方式,我认为 setneedsdisplay 做得很厚,当然,我尝试改变运行循环模式

      [[NSRunLoop currentRunLoop] addTimer:tickTimer forMode:NSDefaultRunLoopMode];

没有帮助。请帮忙,另一个问题是另一个线程会帮助这个吗?我尝试了nsthread,似乎没有帮助....大声笑

4

2 回答 2

1

为此,一个更好的解决方案是CADisplayLink,它在每次刷新帧时调用一个方法。这样,您将避免计时器和实际帧速率之间的不同步。

您设置了一个显示链接,例如:

_dl = [CADisplayLink displayLinkWithTarget: self selector:@selector(refreshFrame)];
[_dl addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[_dl setPaused:NO];

refreshFrame回调中,您可以更新屏幕。您可以使用durationframeInterval来计算从上次刷新经过的时间并相应地调整移动速度:

-(void) refreshFrame
{
    CGFloat speed = 10.0; //points per second
    CGFloat timePassed = (_dl.duration * _dl.frameInterval)];

    //refresh the view (example)
    CGPoint imageCenter = self.imageView.center;
    imageCenter y += speed * timePassed;
    self.imageView.center = imageCenter;
}

这样,即使帧速率随时间变化,视图的速度也保持不变。

于 2013-11-08T12:21:17.923 回答
0

假设计时器事件将以精确的间隔被调用是错误的。根据上次更新的速度和速度矢量以及时间计算新参数。

于 2013-11-08T11:42:28.097 回答