Hello! 欢迎来到阿珏酱のBlog!

同一个动画,我用三种技术栈实现的区别?


avatar
阿珏 2026-05-29 16

最近我做了个挺有意思的小实验。

我把一个二次元角色的小动画效果,分别用:

  • WebGL
  • Canvas 2D
  • 纯 DOM + CSS

实现了三遍。

效果本身不复杂:

  • 眨眼
  • 眉毛/下眼皮联动
  • 流汗轻微飘动
  • 呆毛甩动

但真正有意思的,其实不是“做出来”。

而是:

同一个东西,用三种技术栈实现时,到底会差多少?

本质上就是一次“前端图形学味很浓”的复刻实验。


一开始只是想复刻一个呆毛动画

灵感来源:
https://tamanidamani.itch.io/nijikas-ahoge

我当时想法特别简单:“如果是我,要怎么实现?”

然后越做越上头。

最后直接演变成:

那我干脆把 WebGL、Canvas2D、DOM 三种方案都做一遍算了。

于是仓库就变成了现在这样:

三个版本同效果实现。


先说结论

如果只让我说一句话:

WebGL 最强,但 Canvas2D 最舒服,DOM 最适合业务

后面我慢慢讲。


1. WebGL 版本:最像“真正游戏开发”

这个版本是最折腾的。

因为它本质上已经不是“前端动画”了。

而是:GPU 图形编程


它到底怎么实现的?

核心思路其实就是:

  • 底图一层
  • 精灵图一层层贴
  • shader 控制绘制
  • JS 驱动动画参数

比如:

  • 呆毛旋转
  • 眨眼裁剪
  • alpha 混合

这些其实都在 GPU 那边做。

你会开始接触:

  • uniform
  • texture
  • shader
  • UV
  • 顶点坐标
  • 纹理坐标

然后人会逐渐失去笑容。


但 WebGL 真强

当元素一多的时候。

WebGL 那种: “完全不慌”

的感觉特别明显。

尤其是:

  • 高分辨率
  • 多层贴图
  • shader 特效
  • 粒子
  • 后处理

这种场景。

Canvas2D 会开始喘。

DOM 会开始卡。

WebGL 还在:

“继续上强度。”


但它的开发体验……

只能说:

非常硬核。

你随便一个东西:

“为什么贴图反了?”

你都可能查半小时。

因为:

  • 坐标系不一样
  • UV 方向不一样
  • 纹理原点不一样

甚至:

你 shader 写错一个变量名,页面可能直接黑屏。

然后控制台一句人话都没有。


2. Canvas2D:写起来最爽的版本

因为它属于:

“复杂度刚刚好”。


drawImage 真的是神器

整个版本核心基本就是: ctx.drawImage(...)

不停画。
不停叠。
不停裁剪。


眨眼怎么实现?

这里我其实挺喜欢。

不是直接缩放。

而是:从上往下裁剪源图。

然后底边固定。

这样会更像真正的“闭眼”。

而不是简单的贴图压缩。

这种小细节其实特别影响观感。


呆毛怎么做?

Canvas2D 做旋转特别经典:

save()
translate()
rotate()
drawImage()
restore()

围绕左下角支点转。

完事。

整个思路非常直觉。


为什么我觉得 Canvas2D 是甜点区

因为它有一种:

“既能做效果,又不用掉头发”

的平衡感。

不像 WebGL:

你还没开始做动画,
先被 shader 教做人。

但又不像 DOM:

做到后面会开始和浏览器布局系统打架。

Canvas2D 基本属于:

  • 好调试
  • 浏览器兼容强
  • 思维负担小
  • 足够自由

所以很多独立小游戏特别爱它。

真不是没原因。


3. DOM 版本:最不像“图形编程”的版本

这个版本其实最有意思。

因为它完全不依赖 canvas。

纯:

  • HTML
  • CSS
  • JS

硬做。


五官全是 div

比如:

  • 眼睛
  • 眉毛
  • 汗滴

本质都是: <div>

然后:

  • background-position
  • background-size

从 atlas 里裁。


合眼实现特别像 UI 技巧

这个方案我自己还挺喜欢。

用了: overflow: hidden;

做 mask。

然后里面那个 sprite 往下移动。

这样就实现了:

“从上往下闭眼”。


DOM 的最大优点

特别适合:真网页。

比如:

  • UI 系统
  • 按钮
  • 文本
  • 响应式布局

都能无缝融合。


但 DOM 真的会越来越重

尤其元素一多:

  • layout
  • repaint
  • composite

全来了。

浏览器开始疯狂 recalculation。

然后你会发现:

自己正在用 CSS 做半个游戏引擎。


三种方案到底怎么选?

其实没有“谁秒谁”。

只有:你当前项目更像什么。

如果你要:

  • 做复杂视觉特效 WebGL
  • 做独立小游戏 Canvas2D
  • 做网页交互角色 DOM

这项目我最大的感受

其实不同技术栈背后,
代表的是完全不同的渲染思维。

  • WebGL 想的是:GPU 怎么画
  • Canvas2D 想的是: 我这一帧怎么绘制
  • DOM 想的是:浏览器怎么布局和合成

它们甚至不是同一种世界观。


最后

这个仓库本质上其实不是“做动画”。

而是在研究:

浏览器到底是怎么把东西画出来的。

以上内容建议配合代码食用:https://github.com/iAJue/CanvasGame

上回做这种对比的时候已经是上回了: 《如何优雅的提交一个表单》
图 91

  • avatar
    会员

    太强了,面对这种强者,我没活着的意义,bye

发表评论
OωO表情

相关阅读

最新文章

最新评论

恰饭