我对nstimer和ui更新和绘制有一些问题, 我有一个viewcontroller并在里面放一个计时器,它每0.02秒运行一次, 在这个计时器滴答功能中,我使一个imageview从上到下移动(改变视图中心), 然后添加另一个视图,当触摸开始touchmove和touchend在这个视图上, 绘制一条线并调用setneedsdisplay,当我的fingure在视图上移动时,我之前提到的imageview,移动得更慢, 通过检查时间刻度,我发现,没有手指,它会嘀嗒0.02秒,但是什么时候 继续前进,它减慢到0.1秒,这使得imageview移动得更慢, 任何其他优化方式, 我认为setneedsdisplay做得很厚, 当然,我尝试用
更改runloop模式 [[NSRunLoop currentRunLoop] addTimer:tickTimer forMode:NSDefaultRunLoopMode];
没有帮助。 请帮助,另一个问题是另一个线程会帮助这个吗? 我试过nsthread,似乎没有帮助....大声笑
答案 0 :(得分:1)
为此目的,一个更好的解决方案是CADisplayLink
,每次刷新一个帧时调用一个方法。这样你就可以避免定时器和实际帧速率之间的失步。
您可以设置显示链接,例如像这样:
_dl = [CADisplayLink displayLinkWithTarget: self selector:@selector(refreshFrame)];
[_dl addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[_dl setPaused:NO];
并在refreshFrame
回调中,您可以更新屏幕。您可以使用duration
和frameInterval
来计算上次刷新时间,并相应地调整移动速度:
-(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;
}
这样,即使帧速率随时间变化,视图的速度也会保持不变。
答案 1 :(得分:0)
假设将以精确的间隔调用计时器事件是错误的。根据速度和速度矢量以及上次更新的时间计算新参数。