【问题标题】:Increased Speed while using NSTimer使用 NSTimer 时提高速度
【发布时间】:2012-04-20 05:39:19
【问题描述】:

我创建了一个动画游戏应用程序,其中我使用 NSTimer 在特定时间间隔后移动图像。

timer = [NSTimer scheduledTimerWithTImerInterval:0.2 target:self selector:@selector(MoveVirus) userinfo:nil repeats:YES];

此计时器调用函数 MoveVirus,MoverVirus 移动病毒(屏幕上的图像)。

它在开始时运行良好,但运动速度会自动增加。 运动速度的增加破坏了所有进一步的逻辑。

不知道有什么问题?

请帮忙解决这个问题。

【问题讨论】:

  • 请发-MoveVirus的代码
  • -MoveVirus(顺便说一句,在 Obj-C 中,你的方法名称应该以小写字符开头)做什么?
  • NSLog 在 MoreVirus 方法中的任何内容,并查看控制台中的时间戳。它们是否保持大约 0.2 秒的间隔?如果计时器确实在加速,那么这里有一个非常有趣的问题。但我想你会发现它正在按时运行,并且动画中的某些东西在欺骗你的眼睛。
  • 您可能多次触发计时器,但如果没有更多代码则无法判断
  • 是的,实际上我多次触发计时器......抱歉,我无法回复,因为我有答案。谢谢大家。

标签: iphone animation nstimer


【解决方案1】:

NSTimer 不一定适用于这种用途...来自 NSTimer 上的文档:

定时器不是实时机制;它仅在其中一个时触发 已添加计时器的运行循环模式正在运行并且能够 检查计时器的触发时间是否已过。由于各种 典型的运行循环管理的输入源,有效分辨率 计时器的时间间隔限制在 50-100 左右 毫秒。如果在运行循环中发生计时器的触发时间 不监视计时器或在长时间调用期间的模式, 直到下一次运行循环检查计时器时,计时器才会触发。 因此,计时器可能触发的实际时间可以是 在预定的发射时间之后的很长一段时间。

如果要移动包含在 UIImageView 中的 UIImage,更好的方法是使用 UIView 上的类动画方法。如果使用包含延迟的动画方法,在特定时间后移动图像仍然可以获得相同的结果。方法是:

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

使用这个方法,你可以指定动画的时间(动画你的 UIImages 的移动需要多长时间),在开始这个动画之前等待多长时间,一组动画选项,一段动画代码,以及动画完成时执行的块。

【讨论】:

  • 可能是 OP 在定时器回调中使用了 Core Animation。这就是为什么我们需要查看代码。
  • 当然可以。恕我直言,这并没有改变 UIView 动画更适合并且实际上是针对 NSTimer 上的这种动作的事实。更重要的是,使用 UIView 动画等块有助于防止有时通过调用在其他地方触发方法的方法而获得的碎片代码。
  • 对不起,我的意思是 UIView 动画(核心动画的包装器)可能会在回调中使用,并且 OP 可能只是滥用计时器来获取重复,而不是使用 CA 的重复/完成处理程序功能。
  • 哦,绝对的。无论如何,那个计时器得走了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2014-09-16
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多