Canvas(Kinetic.JS):多层与单层方法

时间:2012-08-28 20:13:27

标签: html5 canvas layer shape kineticjs

任何人都可以解释为什么(实际上, if )在使用像Kinetic这样的东西时,最好将画布游戏的主要部分抽象到不同的层次?

当然感觉就像你应该的那样,到目前为止我一直是:背景的一层,玩家角色的一层,以及其他层。

然后我遇到了一种情况,我需要一个图层的形状坐在另一个图层的形状后面 - 但是将整个图层移到另一个图层后面不是一个选项,所以我不情愿地重新编码所以整个游戏坐在一层。

令我惊讶的是,我仍然可以做我需要的一切。我仍然可以动画或处理各个形状或组的事件。

简而言之:显式分层带来了哪些优势?单层方法可能会遇到哪些陷阱?

3 个答案:

答案 0 :(得分:6)

实际上,图层通常会带来巨大的优势。但是,有时它们不是必需的。只是为了给出一个想法 - 比较PhotoShop(图层)和MS Paint(没有图层)。如果这给你的想法那就是它!

如果不是:图层是一个组织概念。它可以让你处理碎片数据。他们允许:

  1. 将某些转换应用于整个图层。
  2. 基于每个图层自动对对象进行分类,以便获得 层的所有对象,并且很容易使用它们。
  3. 隔离层中发生的任何事情,使其在其他层中发生。
  4. 禁用/启用整个图层。
  5. 更多!
  6. 如您所见,图层通常允许在内容组织级别强制执行封装等抽象,并在某种程度上允许多态。单层方法带来的陷阱只是 - 太紧耦合 - 来自永久混乱世界的野兽封装多态争夺永恒。努夫说!

答案 1 :(得分:5)

如果你的游戏中包含很多不同的东西,绘制一切可能需要一些时间。同一层中的太多会降低性能。虽然太多的层也是如此。

退房:http://www.html5canvastutorials.com/labs/html5-canvas-kineticjs-drag-and-drop-stress-test-with-1000-shapes/

答案 2 :(得分:3)

在组织方面,非公司的答案很明显。然而,正如他已经注意到他的回答更多是关于帆布动画的一般情况,并且你指出KineticJS提供它自己的工具来提供同样的组织利益是非常正确的。

因此,在组织无关紧要的情况下,我们所拥有的只是表现。话虽如此,主要的区别在于每个层都是'对应于不同的画布标签。

简单的答案是,拥有多个图层允许您一次只选择性地重绘一个画布标记。想一想,如果你有一些物体在背景上移动,你想在每次移动这些物体时清除并重新绘制背景吗?

如果您不使用图层,那就是正在发生的事情。你想要的是一个背景,只有在背景改变时再次绘制,这意味着背景层。

这实际上是否值得,在很大程度上取决于您的应用,但这就是您的想法。层(组织外部)的要点是将所需的绘制过程与实际需要绘制的事物隔离开来。对于复杂的动画,这对于保持良好的性能非常重要。

这里有一个jsperf供参考:http://jsperf.com/layered-canvases/3