Why Canvas ?
碰到的问题以及方案
在 WebGL 中使用 Canvas
createImageData
putImageData
层级 Hierarchy
样式 Style
变换 Transform
填充颜色, 描边颜色,描边线宽,图片高宽
position, rotation, scale
分层绘制
计算每个节点变换矩阵(平移,旋转,缩放)
找到图形,更新包围盒,裁剪
放入渲染列表
zlevel, z
快,不精确
适合文字,图片
每次都需要重新构建路径
excanvas 不支持
Non Zero Winding Rule 
求点到线段和曲线的距离
var path = new Path(ctx);
path.moveTo(...);
path.lineTo(...);
...
if (path.isPointInPath(x, y)) {...}
if (path.isPointInStroke(x, y)) {...}
...
path.fastBoundingRect();
path.getBoundingRect();
var path = new Path2D();
...
if (ctx.isPointInPath(path, x, y)) {...}
if (ctx.isPointInStroke(path, x, y)) {...}
WebGL 只支持线段绘制 - 曲线细分
减小 JS 顶点的计算量以及传输到 GPU 的开销
float onet = 1.0 - t;
vec3 position = onet * onet * (onet * p0 + 3.0 * t * p1)
+ t * t * (t * p3 + 3.0 * onet * p2);
多个不透明度逐渐衰减的图形
Lambert Shading