现在的位置: 首页 > 综合 > 编程语言 > 正文

怎样可以得动画更加平滑

2019年12月25日 综合, 编程语言 ⁄ 共 1672字 ⁄ 字号 评论关闭

  注意到当创建CADisplayLink的时候,我们需要指定一个runloop和runloopmode,对于runloop来说,我们就使用了主线程的runloop,因为任何用户界面的更新都需要在主线程执行,但是模式的选择就并不那么清楚了,每个添加到runloop的任务都有一个指定了优先级的模式,为了保证用户界面保持平滑,iOS会提供和用户界面相关任务的优先级,而且当UI很活跃的时候的确会暂停一些别的任务。

  一个典型的例子就是当是用UIScrollview滑动的时候,重绘滚动视图的内容会比别的任务优先级更高,所以标准的NSTimer和网络请求就不会启动,一些常见的runloop模式如下:

  NSDefaultRunLoopMode-标准优先级

  NSRunLoopCommonModes-高优先级

  UITrackingRunLoopMode-用于UIScrollView和别的控件的动画

  在我们的例子中,我们是用了NSDefaultRunLoopMode,但是不能保证动画平滑的运行,所以就可以用NSRunLoopCommonModes来替代。但是要小心,因为如果动画在一个高帧率情况下运行,你会发现一些别的类似于定时器的任务或者类似于滑动的其他iOS动画会暂停,直到动画结束。

  同样可以同时对CADisplayLink指定多个runloop模式,于是我们可以同时加入NSDefaultRunLoopMode和UITrackingRunLoopMode来保证它不会被滑动打断,也不会被其他UIKit控件动画影响性能。

  和CADisplayLink类似,NSTimer同样也可以使用不同的runloop模式配置,通过别的函数,而不是+scheduledTimerWithTimeInterval:构造器

基于定时器的动画

  即使使用了基于定时器的动画,但还是会有一些本质上的区别:在关键帧的实现中,我们提前计算了所有帧,但是在新的解决方案中,我们实际上实在按需要在计算。意义在于我们可以根据用户输入实时修改动画的逻辑,或者和别的实时动画系统例如物理引擎进行整合。

  我们来基于物理学创建一个真实的重力模拟效果来取代当前基于缓冲的弹性动画,但即使模拟2D的物理效果就已近极其复杂了,所以就不要尝试去实现它了,直接用开源的物理引擎库好了。

  我们将要使用的物理引擎叫做Chipmunk。另外的2D物理引擎也同样可以(例如Box2D),但是Chipmunk使用纯C写的,而不是C++,好处在于更容易和Objective-C项目整合。Chipmunk有很多版本,包括一个和Objective-C绑定的“indie”版本。C语言的版本是免费的,所以我们就用它好了。

  Chipmunk完整的物理引擎相当巨大复杂,但是我们只会使用如下几个类:

  cpSpace-这是所有的物理结构体的容器。它有一个大小和一个可选的重力矢量

  cpBody-它是一个固态无弹力的刚体。它有一个坐标,以及其他物理属性,例如质量,运动和摩擦系数等等。

  cpShape-它是一个抽象的几何形状,用来检测碰撞。可以给结构体添加一个多边形,而且cpShape有各种子类来代表不同形状的类型。

  在例子中,我们来对一个木箱建模,然后在重力的影响下下落。我们来创建一个Crate类,包含屏幕上的可视效果(一个UIImageView)和一个物理模型(一个cpBody和一个cpPolyShape,一个cpShape的多边形子类来代表矩形木箱)。

  用C版本的Chipmunk会带来一些挑战,因为它现在并不支持Objective-C的引用计数模型,所以我们需要准确的创建和释放对象。为了简化,我们把cpShape和cpBody的生命周期和Crate类进行绑定,然后在木箱的-init方法中创建,在-dealloc中释放。木箱物理属性的配置很复杂,所以阅读了Chipmunk文档会很有意义。

  结束语:以上就是有关在HTML中怎样引入CSS样式的全部内容,更多内容请关注学步园。

抱歉!评论已关闭.