因此,我处于第一个iOS游戏之中,并且正在努力寻求整合对象移动的最佳方法。
游戏严重依赖于快速移动的对象以及持续不断的用户输入更改。因此,我正在尝试使对象集成和约束求解器尽可能快且准确地运行(以最大程度地减少连续游戏循环调用之间的用户输入变化)。
更具体地说,我不确定NSTimer类和CACurrentMediaTime()函数的功能。很难凭经验进行测试,因为我不确定哪个错误较大。例如,使用重复间隔为0.008(约2次更新/屏幕刷新)的NSTimer并在连续的调用中调用CACurrentMediaTime(),我发现两次调用之间的时间间隔在0.0075-0.009之间。很难说是哪个造成了(小的)不一致。因此,确定时间步长应为:
学生和所有这一切的新手-请保持友好:)任何建议,我们将不胜感激。谢谢你的时间。
最佳答案
NSTimer
不是实时计时器。它甚至不接近,也不意味着是。如果您查看速度快于半秒,那么NSTimer
是错误的工具。一秒钟之内,我什至不推荐它。对于几秒钟的事情,尤其是数分钟的事情,当您并不真正在乎它何时触发时,那就太好了。我用它所有的时间。CACurrentMediaTime()
不是计时器。它是系统中最精确的时间函数的包装器:mach_absolute_time()
。因此,如果您真正关心现在的几点,并且希望以一个人类可以理解的数字来表示,那么CACurrentMediaTime()
是您的功能。 mach_absolute_time()
将为您提供一个真正准确的数字,但这是基于Mach absolute time unit的,它实际上并未映射到讨厌的人所想的任何东西(并且每个CPU的比例都不同)。这就是为什么我们要使用CACurrentMediaTime()
来使我们的生活更轻松。
好的,因此NSTimer
不是实时的,而且CACurrentMediaTime()
不是计时器。游戏程序员要做什么?
Grand Central Dispatch包括我们拥有的最好的“大约在此时运行”系统之一。这是调度源。我之所以说“大约这个时间”,是因为GCD仍然不是实时操作系统专家所认为的那样真正的“实时”。但这对于游戏开发人员来说足够实时。在Concurrency Programming Guide中寻找创建计时器。还要看一看dispatch_after()
,这对于一次“延迟运行”很有用。
记住,在您的主线程(UI线程,完成所有绘制)上运行的任何事物都将与该线程上的其他事物共享时间。因此,在主线程上处理图形和用户交互时,通常需要在后台线程上进行计算。这就是GCD dispatch_queues旨在帮助您的事情。另一方面,请记住,许多iOS设备都是单核的。因此,“后台线程”有点用词不当。实际上一次只能在CPU上运行一件事。这就是为什么将事物移至GPU如此重要的原因(请参见下文)。
您可能还需要认真研究像cocos2d这样的系统,它是一个非常好的游戏引擎。它会为您处理很多此类细节,并让您专注于游戏部分。
停留在Apple框架中,您还应该看看Core Animation。如果要使用计时器在屏幕上四处移动,则不应该这样做。核心动画是您在屏幕上四处移动事物的方式。它比您自己需要照顾很多细节,速度更快,消耗的电池更少,并且将大量工作转移到了GPU(如上所述)。它是针对UI元素而不是游戏而设计的,但绝对可以用于构建简单的游戏。
当然还有GLKit,但这是完全不同的事情。