首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSTimer vs CACurrentMediaTime()

NSTimer vs CACurrentMediaTime()
EN

Stack Overflow用户
提问于 2012-07-26 07:51:46
回答 2查看 10.6K关注 0票数 23

因此,我正处于我的第一个iOS游戏中,正在努力寻找整合对象移动的最佳方法。

这个游戏在很大程度上依赖于快速移动的对象和持续快速的用户输入变化。因此,我试图让对象集成和约束求解器尽可能快速和准确地运行(以最小化连续游戏循环调用之间的用户输入更改)。

更具体地说,我不确定NSTimer类和CACurrentMediaTime()函数的功能。这很难进行经验测试,因为我不确定哪种方法的误差更大。例如,使用重复间隔为0.008 (~2次更新/屏幕刷新)的NSTimer,并在连续调用时调用CACurrentMediaTime(),我发现调用之间的时间间隔在0.0075 - 0.009之间变化。很难说哪一个是(小)不一致的原因。因此,为了确定时间步长,我应该:

  1. 假设NSTimer足够精确,可以使用NSTimer时间间隔作为游戏循环时间步长,
  2. 使用CACurrentMediaTime()来确定连续游戏循环调用之间的时间间隔。

学生和新手-请友好:)任何建议都非常感谢。耽误您时间,实在对不起。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-26 10:26:19

NSTimer不是实时计时器。它甚至不是很接近,也不是说要接近。如果你正在寻找任何比半秒更快的东西,NSTimer是错误的工具。我甚至不会推荐它用于低于一秒的事情。对于几秒钟的事情,特别是几分钟的事情,当你并不真正关心它什么时候触发时,它是很棒的。我一直在用它。

CACurrentMediaTime()不是计时器。它是系统中最精确的时间函数mach_absolute_time()的包装器。所以如果你真的关心现在是什么时间,并且你想要一个人类可以理解的数字,那么CACurrentMediaTime()就是你的函数。mach_absolute_time()会给你一个非常准确的数字,但它是基于Mach absolute time unit的,它实际上并没有映射到任何讨厌的人类思考的东西(并且每个处理器都有不同的规模)。这就是为什么我们有CACurrentMediaTime()让我们的生活变得更容易。

好的,所以NSTimer不是实时的,CACurrentMediaTime()也不是计时器。游戏程序员应该做什么?

Grand Central Dispatch包含了我们拥有的一些最好的“在这个时候运行”的系统。这是一个调度源。我之所以说“大约这个时候”,是因为GCD仍然不是RTOS人员所说的真正的“实时”。但它对游戏开发人员来说是足够实时的。在Concurrency Programming Guide中查找创建计时器。还可以看看dispatch_after(),它非常适合于一次性“延迟后运行”。

请记住,在主线程(完成所有绘图的UI线程)上运行的任何内容都将与该线程上的其他所有内容共享时间。因此,当您在主线程上处理绘图和用户交互时,通常需要在后台线程上进行计算。这就是GCD dispatch_queues要帮助你做的事情。另一方面,请记住,许多iOS设备都是单核的。所以“后台线程”有点用词不当。在CPU上一次只能真正运行一件事。这就是为什么将东西移动到GPU是如此重要(见下文)。

您可能还想认真考虑一下像cocos2d这样的系统,它是一个非常好的游戏引擎。它为你处理了很多这样的细节,让你专注于游戏部分。

停留在Apple框架中,您还应该看看Core Animation。如果你用计时器在屏幕上移动东西,你就不应该这么做。核心动画是如何在屏幕上移动物体的。它为你处理了很多细节,速度更快,使用的电池比你自己做的要少得多,而且它将大量的工作转移到GPU上(正如我上面提到的)。它更多地是为UI元素而不是游戏而设计的,但它绝对可以用来构建简单的游戏。

当然还有GLKit,但那是完全不同的事情……

票数 40
EN

Stack Overflow用户

发布于 2012-07-26 10:23:48

根据NSTimer documentation the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds.的说法,这可能就是为什么你会看到时间间隔的变化。

我建议你把更新时间间隔改为0.016秒,因为没有理由让你的游戏状态更新的频率超过屏幕所能绘制的频率。然后您可以使用CADisplayLink来处理计时。这应该非常准确,因为它使用的是显示器的刷新率。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11660403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档