保存和加载 HTML5 Canvas 舞台的最佳实践
保存/加载完整舞台内容的最佳方式是什么?如何实现撤销/重做?
如果你想保存/加载简单的画布内容,可以使用内置的 Konva 方法:node.toJSON() 和 Node.create(json)。
请参见 简单示例 和 复杂示例。
但这些方法只适用于非常小的应用。在较大的应用程序中,使用这些方法非常困难。为什么?因为树结构通常非常复杂,你可能会有许多事件监听器、图片、滤镜等等。这些数据无法序列化成 JSON(或者说很难做到)。
此外,树中的节点常常包含大量信息,这些信息并不直接关系到应用的状态,而只是用来描述应用的视觉视图。
举个例子,假设我们有一个游戏,在画布中绘制几个球。这些球不仅仅是圆形,而是带有阴影和文字(比如“Made in China”)的复杂视觉对象组。现在假设你想序列化应用状态并在别处使用,比如发送到另一台电脑或实现撤销/重做功能。几乎所有的视觉信息(阴影、文字、大小)都不是关键,可能不需要保存。因为所有的球的阴影、大小等都是一样的。但关键是什么?在这种情况下,就是球的数量和它们的坐标。你只需要保存/加载这些信息。它就只是一个简单的数组:
var state = [{x: 10, y: 10}, { x: 160, y: 1041}]