AVM 2 兼容性(AS3):快速完善中,支持现状与已知 API 缺口
AVM 2 是什么
2006 年 Flash Player 9 发布时引入了 ActionScript 3 和对应的 AVM 2 虚拟机。AS3 是一次彻底不兼容的重写——更像 Java / C#(强类型、类、接口、包、package 声明),跟 AS1/AS2 完全不同。
Flash Professional CC(2013)之后 Adobe 强制所有新项目用 AS3——所以 2013 年之后的所有 Flash 内容(包括 Adobe AIR 应用、Mobile Flash、大量大型 Flash 游戏)都是 AVM 2。
官方数据
| 维度 | 进度 |
|---|---|
| Language(AS3 语言本身) | ~90% |
| API(内置类 / 方法) | ~82% |
注意两个数字跟 AVM 1 的「语言 99% / API 82%」对比——Language 进步明显,但 API 方面 AS3 的类库极其庞大(flash 命名空间下有上百个包),82% 已经覆盖了最常用的子集。
为什么 AS3 游戏经常出问题
AS3 游戏(尤其是大型商业 Flash 游戏)大量使用 AS3 独有的高级特性:
flash.net.NetConnection/NetStream:RTMP / RTMPT 流媒体(在线 Flash 游戏视频/音频)—— Ruffle 还不支持 RTMPflash.media.Video+ H.264:Ruffle 需要 Cisco OpenH264 运行时(桌面版可以勾上,Web 版靠浏览器原生解码)flash.external.ExternalInterface:SWF 和外部 JS 互调(嵌入到网站时常见,需要站长配置允许)flash.system.Security:跨域安全策略、security.loadPolicyFile()等flash.utils.ByteArray:复杂二进制数据操作(序列化、压缩、加密)flash.events.NetStatusEvent/HTTPStatusEvent:网络请求的完整状态机
上面任何一个 API 没实现或行为有差异,都可能让一个依赖它的 AS3 游戏直接白屏或报错。这跟 AVM 1 的「轻微不准但还能玩」完全不同。
已知不支持的 AVM 2 功能
ruffle.rs/compatibility/avm2 页面维护了一个完整的已实现 API 列表和未实现 API 列表。主要缺口:
flash.net.Socket的非 HTTP 连接(原始 TCP Socket)flash.net.DatagramSocketflash.display.Loader.loadBytes(某些动态加载 SWF 的游戏用)- 一部分
flash.text的高级排版(TSFRenderingEngine,也就是 Flash Text Engine FTE) fl.netrtmp(Adobe 官方的 RTMP 库)
怎么自己快速测试一个 AS3 SWF
- 把 SWF 拖进 Ruffle 桌面版
- 如果画面起来了、能动、能交互 —— AVM 2 支持度足够
- 如果白屏或报错 —— 在命令行加
--verbose启动:ruffle.exe --verbose game.swf,控制台会打印具体卡在哪个 ActionScript 调用上 - 对比 ruffle.rs/compatibility/avm2 的未实现 API 列表,看能不能找到对应的缺项
一个现实的预期
- 简单 AS3 应用(表单、简单动画、小工具):绝大多数能跑
- 中型 AS3 游戏(2010–2015 年之间):能不能跑看运气,取决于它用了哪些 API
- 大型 AS3 商业游戏(2013+,Adobe AIR 级别):大概率跑不起来,需要 Flashpoint 或旧 Flash Player 虚拟机
报告 AS3 兼容性问题
在 GitHub Issue Tracker 开新 Issue 时,附上:
- SWF 文件本身(或如果是商业项目,附最小可复现 demo)
- Ruffle 版本(稳定版还是 nightly,版本号 / commit hash)
- 浏览器 / 操作系统版本
--verbose或 Console 里的完整报错- 对比:同一个 SWF 在旧 Flash Player 里的行为截图(如果能跑的话)