AVM 1 兼容性(AS1 / AS2):绝大多数老 Flash 内容能直接跑
AVM 1 是什么
所有在 Flash Player 9(2006 年 6 月发布)之前开发的 Flash 内容,以及 2006–2013 年之间虽然也能用 AS2 写但作者还没迁到 AS3 的项目——全部跑在 AVM 1(ActionScript Virtual Machine 1)上。
Flash Professional CC(2013 年版)之后 Adobe 强制 AS3,所以最后一批 AVM 1 内容大约出现在 2013 年。那之前十几年间海量的小游戏、贺卡、Banner、互动教学内容,绝大多数都是 AVM 1。
官方数据
| 维度 | 进度 |
|---|---|
| Language(语言本身) | ~99% |
| API(内置类 / 方法) | ~82% |
这个数字来自 ruffle.rs/compatibility 页面,2026 年 10 月官方最新数据。Language 方面基本上 AVM 1 的所有语法(变量、函数、原型链、with 语句、eval 等)都已经实现。
哪些 AVM 1 内容最稳
- 经典 Flash 小游戏:Newgrounds 早期、Miniclip、Armor Games 2010 年之前的那批——比如 Alien Hominid、FlyGuy、Marvin Spectrum,Ruffle 官方 demo 里就内置了这些作为基准测试
- Flash Banner 广告:结构简单、只用 MovieClip 和 timeline 的那种
- Flash 贺卡 / 电子相册:同样简单,主要是时间线动画
- 小团队或个人用 Flash MX / Flash 8 做的课件:一般只用基础绘图 API,Ruffle 支持很好
已知的 AVM 1 图形不准
官方承认有一些图形渲染上的细微差异,主要集中在:
- 字体渲染:Ruffle 用浏览器字体渲染,旧 Flash Player 有自己的字体光栅化引擎——同样的字体、字号,两边渲染出来像素级可能不完全一致(字形轮廓、字间距、行距)
- 滤镜效果:
BlurFilter、GlowFilter、DropShadowFilter在 Ruffle 里用 WebGL 模拟,跟旧 Flash Player 的 CPU 光栅化有细微差异 - BitmapData 操作:
BitmapData.draw()、copyPixels()、noise()、perlinNoise()的结果可能有细微偏差——但对绝大多数 AVM 1 游戏来说不影响可玩性 - Sound 对象:
Sound.loadSound()加载 MP3 的行为与旧版略有不同(Flash Player 会预解码、Ruffle 流式解码),所以精确 seek 可能差几毫秒
这些差异绝大多数肉眼不明显,除非你在做像素级截图比对或者非常精确的音频同步。
AVM 1 里有哪些 Ruffle 还没实现的 API
完整列表在 GitHub Issue Tracker 里(issue #310)。主要是:
- 一部分冷门的
flash.net类 - 一部分
flash.xml的高级解析方法 flash.media.Video的一部分控制 API(AVM 1 里用得很少,因为 FLV 主要是 AVM 2 的事)
如果你跑一个老 Flash 程序,Console 里出现 Ruffle: Unimplemented ... 或者弹出一个对话框说某个 API 不支持——对照 Issue Tracker 看一下是不是已知问题、有没有人已经在修。
跟 Flashpoint 的关系
Flashpoint 项目为了做完整归档,对 AVM 1 也会用。但 Flashpoint 的主要武器是带着旧版 Flash Player 跑(靠 Wine / 虚拟机兼容),而 Ruffle 是完全重写的。如果你不需要精确到像素级的完美复刻、只想能玩就行,Ruffle 独立版更轻更快,不需要虚拟机。