ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ruffle:用 Rust 重写、免插件播放 SWF 的 Flash Player

Ruffle:用 Rust 重写、免插件播放 SWF 的 Flash Player Ruffle用 Rust 重写、免插件播放 SWF 的 Flash Player【免费下载链接】ruffleA Flash Player emulator written in Rust项目地址: https://gitcode.com/GitHub_Trending/ru/ruffle硬盘里那批二十年前的 SWF 游戏自 2020 年 Flash Player 退役后就失去了打开它们的工具。Ruffle 是一个用 Rust 编写的 Flash Player 模拟器桌面版是一个独立应用把 SWF 文件拖进窗口就能播放不需要浏览器不需要插件。SWF 的旧运行方式Ruffle 换了一种Flash 内容过去的运行方式是往系统或浏览器里装一个插件插件是经典的安全攻击面停止维护后漏洞无人修复而浏览器厂商随后也撤掉了加载插件的接口。文件本身没坏缺的只是一个执行环境。Ruffle 把 SWF 当成一个应当解析的文件格式用 Rust 重写了解析、ActionScript 3.0 虚拟机和渲染管线产物是一个普通桌面程序SWF 从打不开变成可以拖放、可以双击、可以作为命令行参数传给它。拖入 SWF 之后发生了什么文件拖放的入口在 desktop/src/app.rswinit 报告DroppedFile事件处理只有几行WindowEvent::DroppedFile(file) { if let Some(desc) ContentDescriptor::new_local(file, None) { self.gui.create_movie(mut self.player, options, desc); } }ContentDescriptor定义在 frontend-utils/src/content.rs是URL 可选根内容目录的封装。接着GuiController::create_moviedesktop/src/gui/controller.rs把它交给player.rs里的PlayerController由PlayerBuilder构建出Player。之后真正干活的是 core/src/swf/ crate 逐 tag 解析二进制流avm1/avm2分别执行两代 ActionScriptbackend/抽象出音频、文件系统与网络。每一帧 Player 产出一组绘制指令render/wgpu/ 的渲染后端把它们变成 GPU 调用。帧循环同样在 app.rs收到RedrawRequested时先调player.render()推进一帧逻辑再gui.render()合成界面然后必须立刻 return——代码注释写明原因否则 winit 请 egui 重绘、egui 又请 winit 重绘两边会陷入反馈循环。三个值得展开的设计细节图形后端的回退链启动时 Ruffle 按用户偏好顺序尝试后端Vulkan、Metal、OpenGLtry_wgpu_backend用一个标准判断可用性能否枚举到至少一个图形适配器。首选全失败时打一条 warn再逐个尝试Backends::all()里剩下的实在没有可用设备才报错退出。这条链让只装了老旧显示驱动的机器也能把应用拉起来。单个 SWF 不够用老 Flash 应用常是一个 .swf 入口加一堆同目录的 .swf、.jpg、.mp3 资源。ContentDescriptor的root_content_path字段就是为此准备的提供它时SWF 内部引用的资源路径会相对该目录解析多个文件一起构成一个Bundle单文件电影则走DirectFile直接加载。区别在于能打开和能完整打开。窗口看不见时不渲染处理重绘前先看!self.minimized !self.occluded窗口最小化或被其他窗口完全遮挡时跳过整帧渲染。两种平台的报告方式不同Windows 上最小化是 0×0 的 Resized 事件macOS 报 Occluded代码里逐条注明了差异。另一个细节电影处于暂停状态时没人会来触发重绘所以Occluded(false)恢复可见时要自己调request_redraw()。三步跑通 SWF 播放器git clone https://gitcode.com/GitHub_Trending/ru/ruffle cd ruffle/desktop cargo run --release跑起来后你首先会看到一个 Open File or URL 对话框上方是 File / View / Debug Tools 菜单栏。上面那张 Bloons TD 的截图来自一个 .swf。编译完之后找一台机器上任意一个 SWF 拖进窗口就能验证这套 Rust 重写的播放链路是否成立。【免费下载链接】ruffleA Flash Player emulator written in Rust项目地址: https://gitcode.com/GitHub_Trending/ru/ruffle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表