从巅峰时期的 4399 小游戏,到 2020 年的正式终结 —— 一段互联网技术兴衰史
Adobe Flash(前身为 Macromedia Flash)是一套完整的多媒体创作平台,由三个核心部分组成:
SWF (Shockwave Flash) 是 Flash 的核心产物,一个编译后的 二进制 Tag 流。它不是文本格式,而是类似字节码的紧凑二进制:
Flash 使用 矢量图形而非位图。一张位图存的是"每个像素的颜色",而矢量图存的是"画一条从 (x1,y1) 到 (x2,y2) 的贝塞尔曲线,填充红色"这样的绘制指令。
Flash 内部使用 贝塞尔曲线 + 填充规则(even-odd / non-zero winding)来描述形状。播放器在渲染时将矢量指令实时光栅化(rasterize)为屏幕上的像素。这意味着:
这就是 4399 游戏页面背后最核心的 HTML 代码。浏览器检测到 <object> 或 <embed> 标签指向 .swf 文件后,调用已安装的 NPAPI (Netscape Plugin API) Flash Player 插件来渲染。
| 特性 | ActionScript 1.0 (2000) | ActionScript 2.0 (2003) | ActionScript 3.0 (2006) |
|---|---|---|---|
| 编程范式 | 原型链 + 过程式 | 基于类的语法糖 | 真正的 OOP 类继承 |
| 类型系统 | 无类型(动态) | 编译时类型检查(弱) | 强类型 + 运行时检查 |
| 虚拟机 | AVM1(解释执行) | AVM1(解释执行) | AVM2 + JIT 编译 |
| 性能 | 低(纯解释) | 低(编译到 AVM1) | 高(接近原生 10x 提升) |
| 事件模型 | onClipEvent / on() | 回调 + 监听器 | DOM3 风格事件流 |
| API 能力 | 基础图形 + 鼠标 | 组件 + 数据绑定 | E4X(XML) + Socket + 正则 |
这个模式在所有 4399 游戏中高度一致:ENTER_FRAME 事件驱动的游戏主循环(每帧 30 次),配合 Flash 内置的显示列表自动渲染。ExternalInterface 是与 4399 后端交互的唯一桥梁。
AS3 引入的显示列表是一棵树形结构,类似浏览器的 DOM 树。每个可视对象(Sprite、MovieClip、Shape)都是树上的一个节点。Flash Player 每帧按序遍历这棵树,执行坐标变换、混合、裁剪,最终输出到屏幕。
这套设计非常超前——和现代浏览器 DOM 渲染、React 的虚拟 DOM、游戏引擎的 Scene Graph 是同一种思想。
2010 年 Steve Jobs 发表著名的 "Thoughts on Flash" 公开信,宣布 iPhone/iPad 永不支持 Flash。
核心论点:Flash 是"PC 时代的产物",为鼠标设计,不适合触摸屏;功耗过高,严重拖累电池续航。
Flash Player 是历史上漏洞最多的软件之一。2015 年 Hacking Team 数据泄露事件暴露了多个可远程执行代码的 0-day 漏洞。
NPAPI 插件架构给了 Flash 完全的系统权限,一个沙箱逃逸就可能导致系统沦陷。
Flash Player 在 Mac 上极其低效。Jobs 指出:一台 MacBook 播放 Flash 视频时,续航从 10 小时跌到 1.5 小时。
频繁的插件崩溃导致浏览器假死,用户体验极差。
2014 年 HTML5 正式发布,原生提供了 Flash 所有核心能力:
<canvas> 替代矢量渲染、WebGL 替代 3D、Web Audio 替代音频、CSS3 动画替代补间、JavaScript 替代 ActionScript。
Flash 是一个 专有平台,完全受 Adobe 控制。开发者、浏览器厂商、操作系统厂商无法参与标准制定。
相比之下,HTML5 由 W3C/WHATWG 开放治理,所有浏览器厂商共同推动。
Adobe 自己也在放弃 Flash。2011 年停止移动端 Flash Player 开发;2016 年将 Flash Professional 更名为 Animate CC,转向 HTML5 输出。
2017 年正式宣布 2020 年底终止 Flash Player。
在 "Thoughts on Flash" 中,Jobs 列出了 Flash 的六宗罪:不开放、不可靠、不安全、耗电、不兼容触摸、不是 Web 标准。这封信被广泛视为 Flash 死亡的开端。
虽然当时争议巨大,但历史证明 Jobs 的判断完全正确——HTML5 只用了不到 10 年就彻底取代了 Flash 的所有应用场景。
| Flash 能力 | Flash 实现 | HTML5 替代方案 | 优势方 |
|---|---|---|---|
| 矢量动画 | 时间轴 + 补间动画 | CSS3 Animation / SVG SMIL / Lottie | HTML5 (更轻量) |
| 2D 游戏渲染 | Display List + 矢量 | <canvas> 2D Context / PixiJS | HTML5 (GPU 加速) |
| 3D 渲染 | Stage3D (Flash 11+) | WebGL / WebGL 2.0 / Three.js | HTML5 (更强大) |
| 音频播放 | Sound 类 | <audio> / Web Audio API | HTML5 (低延迟) |
| 视频播放 | FLV / F4V 容器 | <video> + MP4/WebM | HTML5 (硬件解码) |
| 编程语言 | ActionScript (ECMAScript 方言) | JavaScript / TypeScript | HTML5 (开放标准) |
| 网络通信 | Socket / URLLoader | Fetch / WebSocket / WebRTC | HTML5 (更完善) |
| 字体渲染 | 嵌入字体 (DefineFont) | @font-face / WOFF2 | HTML5 (更灵活) |
4399 网站至今仍在运营,但游戏已经从 .swf 全面迁移到 HTML5(Canvas + WebGL)。白鹭引擎 (Egret) 和 LayaAir 是当年国内 H5 游戏黄金时代的代表引擎,它们的 API 设计刻意模仿了 AS3 的显示列表模型,方便 Flash 开发者迁移。
Flash 的时间轴 + 补间动画模型深刻影响了 After Effects、Lottie、Rive 等现代动画工具
无数中国游戏开发者从 Flash 起步,包括后来做出《原神》的米哈游团队早期也使用过 Flash
Scene Graph 渲染树模型被 Unity、Cocos、Egret 等几乎所有游戏引擎继承
专有平台 vs 开放标准:Flash 的消亡是互联网历史上最经典的案例——当一项技术的未来由一家公司独自掌控时,一旦行业共识转向开放标准,它就会迅速崩溃。无论它曾经多么强大。
技术终将被更优的方案替代:Flash 本质上是一个在浏览器中运行独立应用程序的沙箱,而 HTML5 把这个沙箱做成了浏览器本身。当浏览器原生就能做 Flash 能做的一切时,插件就失去了存在意义。