Ruffle - Adobe Flash Playerエミュレータ

Ruffleは、レガシーなFlashコンテンツ(ゲーム、アニメーション、アプリケーション、SWFバナー)を実行するために不可欠なAdobe Flash Playerエミュレータです。すべてのオペレーティングシステム(Windows、macOS、Linuxを含む)上でスタンドアロンアプリケーションとして動作し、WebAssemblyを介してブラウザに統合されます。

Ruffleは、Windows、macOS、Linux向けに個別のビルドを提供しており、これらは通常のプログラムと同様に動作します。実行ファイルを起動し、その中で目的のSWFファイルを開くだけです。

Ruffleは、Rust言語のメモリ安全性と最新ブラウザのサンドボックスを活用しています。これにより、潜在的に危険な古いコンテンツを、システム感染やデータ漏洩のリスクなく実行できます。

このエミュレータは、古いAVM1(ActionScript 1および2、2006年まで使用)と、より複雑なAVM2(ActionScript 3)の両方をサポートします。これは、2000年代初頭のアニメーションから、この技術が廃止される直前にリリースされた複雑なゲームやアプリケーションに至るまで、事実上すべてのFlashコンテンツを正しく動作させるために必要です。

ダウンロードリンク:

すべてのリンクは公式ソースにリンクしています。Windows(x86_64)、macOS(IntelとApple Silicon両対応のユニバーサル)、Linux(x86_64およびRaspberry PiやARMデバイス向けARM64)用のビルドはRuffleプロジェクトのGitHubリポジトリから配布され、Flatpak形式のLinux版はデジタル署名とアプリケーション分離機能を備えた公式Flathubカタログから入手できます。

Ruffleの主な機能

WebAssemblyによる統合。 ブラウザでの動作のために、RuffleはWebAssembly(Wasm)にコンパイルされます。これは、ブラウザの分離されたサンドボックス内でネイティブに近いパフォーマンスで実行される低レベルバイトコードです。これにより、時代遅れで安全でないNPAPI/PPAPIプラグインをインストールすることなく、複雑なFlashグラフィックやロジックを読み込み、処理することができます。

Flashコンテンツの自動検出とポリフィル。 Ruffleのウェブ版にはJavaScript検出機能が含まれており、ページのDOM構造内のobject、embed、applet要素、および.swf拡張子を持つファイルをスキャンします。そのようなコンテンツを検出すると、Ruffleは自動的にそれを自身のプレーヤーに置き換え、ユーザーに対して透過的にページを修正し、Flash要素の機能を復元します。

二重動作モード(デスクトップアプリケーションとウェブ拡張機能)。 Ruffleはユーザーに柔軟性を提供します。ローカルSWF再生用のスタンドアロンデスクトップアプリケーション(Ruffle実行ファイルにファイルを関連付けるだけ)として、またはブラウザのウェブ閲覧環境に統合され、任意のサイトでFlashサポートを提供するブラウザ拡張機能として使用できます。

ActionScript 1.0および2.0(AVM1)のサポート。 RuffleはAVM1仮想マシンを実装しており、2006年以前から2013年頃までに作成された膨大なコンテンツとの互換性を保証します。AVM1言語構造の現在の互換性レベルは99%に達し、APIについては81%であり、初期のFlashゲームやアニメーションの大部分が正しく動作することを保証します。

ActionScript 3.0(AVM2)のサポート。 2006年以降に作成されたコンテンツのために、RuffleはAVM2の実装を含んでいます。互換性向上の作業は積極的に進行中ですが、エミュレータはすでに多くの複雑なActionScript 3で書かれたゲームやアプリケーションを実行するのに十分なサポートレベルを提供しており、APIカバレッジと言語機能を継続的に拡大しています。

Rust言語レベルの安全性。 Ruffleの主要なアーキテクチャ上の利点の一つは、Rust言語の使用です。Rustはコンパイル時にメモリ安全性を保証し、バッファオーバーフロー、ダブルフリー、use-after-freeエラーなど、元のAdobe Flash Playerを悩ませていた脆弱性のクラス全体を完全に排除します。

ブラウザサンドボックス内での分離。 ウェブ環境で動作する場合、Ruffleは(WebAssemblyを介して)ブラウザのセキュリティポリシーに完全に準拠します。これにより、追加の分離レイヤーが追加されます。エミュレータはユーザーのファイルシステムやその他のシステムプロセスに直接アクセスできないため、従来のFlashプラグインと比較して悪用が非常に困難になります。

効率的なメモリ管理。 非決定的な一時停止を伴うガベージコレクションを使用した元のFlash Playerとは異なり、RuffleはRustの厳格な所有権モデルを継承しています。これにより、より予測可能なメモリ使用が可能になり、断片化が減少し、ブラウザの不安定な動作を引き起こすことが多かったメモリリークが排除されます。

コマンドラインサポート。 Ruffleのデスクトップ版は、完全に機能するコマンドラインインターフェースを提供します。ユーザーはパラメータを指定してエミュレータを実行できます。例:ruffle filename.swf(ローカルファイル)、またはruffle https://example.com/filename.swf(URLからSWFを再生)。コマンドruffle --helpを実行すると、利用可能なすべての引数と設定の包括的なリストが表示されます。

オープンソースコードと開発の透明性。 RuffleはApache 2.0およびMITライセンスの下で配布されています。ソースコードが完全に公開されているということは、あらゆる開発者がエミュレータのセキュリティを監査し、修正を提供し、その開発に参加できることを意味し、企業開発者によって導入される可能性のある隠された機能や脆弱性の可能性を排除します。

幅広いブラウザとの互換性。 WebAssembly技術のおかげで、RuffleはGoogle Chrome、Mozilla Firefox、Microsoft Edge、Safari、Opera、Brave、Vivaldiを含むすべての最新ブラウザでサポートされています。これにより、ユーザーがブラウザエンジン(Chromium、Gecko、またはWebKit)を好むかどうかに関わらず、一貫したFlashコンテンツ体験が保証されます。

モバイルブラウザ(iOSおよびAndroid)のサポート。 iOSで公式にサポートされておらず、Androidで限定的なサポートしかなかった元のAdobe Flash Playerとは異なり、Ruffleはモバイルプラットフォームで動作します。これにより、スマートフォンやタブレットでモバイルブラウザ経由で直接Flashゲームやアニメーションを実行でき、アーカイブされたコンテンツへのアクセスをモバイルユーザーに開放します。

設定は不要。 Ruffleは「セットして忘れる」という原則に基づいて設計されています。拡張機能をインストールするか、デスクトップアプリケーションを起動した後、エミュレータは複雑な設定を必要としません。ステージサイズ、フレームレート、インタラクションタイプなどの再生パラメータを自動的に検出し、ユーザーの介入なしに最適な設定を適用します。

ゼロデイ脆弱性からの保護。 Ruffleはプラグインではなく、時代遅れのAPIを使用せず、セキュリティに焦点を当てたRustでコードが書かれているため、Adobe Flash Playerに特徴的であった攻撃の影響を受けません。これにより、レガシーコンテンツへのアクセスを維持しなければならないが、システムが危険にさらされるリスクを冒せない組織にとって理想的なソリューションとなります。

様々なインストール方法との互換性。 Ruffleはいくつかの展開方法を提供しています。ウェブ開発者は、Chromiumベースのブラウザに静的拡張機能として(開発者モードを介して)インストールしたり、Firefoxに一時的なアドオンとして(about:debuggingを介して)インストールしたりできます。サーバーサイドでの簡単なJavaScriptコード挿入による統合も利用可能です。

オンラインおよびオフラインコンテンツの再生。 Ruffleのデスクトップ版では、コンピュータにローカルに保存されたSWFファイルを開いて再生することができます。これにより、RuffleはFlashゲームやアニメーションのローカルアーカイブを扱うコレクター、アーキビスト、研究者にとって不可欠なツールとなっています。

高いレンダリングパフォーマンス。 Ruffleは、クロスプラットフォームライブラリを介して最新のグラフィックスAPI(OpenGL、Vulkan、DirectX、WebGLなど)を使用します。これにより、ベクターグラフィックスとラスターグラフィックスのレンダリングにハードウェアアクセラレーションが提供され、元のFlash Playerでは動作が遅くなる可能性があった、より弱いデバイスでもスムーズな再生が可能になります。

活発な開発と頻繁なアップデート。 このプロジェクトは活発に開発中です。リリースは定期的に公開され、重要なバグ修正と拡張されたActionScript APIサポートの両方が含まれています。例えば、最近のバージョンではString.indexOfおよびlastIndexOfメソッドのエッジケースが修正され、Array.indexOfでの負のインデックスが正しく処理されるようになりました。

主要なアーカイブやプラットフォームとの統合。 Ruffleは、Internet Archive、Newgrounds、Coolmath Games、Armor Gamesなどの大手企業によってFlashコンテンツ再生の公式プレーヤーとして選ばれています。これは、エミュレータの高い信頼性と互換性、および実際の条件下で高負荷下で動作する能力を裏付けています。

ゲームセーブと状態のサポート。 元のFlash Playerと同様に、RuffleはLocal Shared Objects(LSO)をサポートしています。多くのゲームが進行状況の保存にこれを使用しています。エミュレータはこのストレージへのデータ読み書きメカニズムを正しくエミュレートし、アプリケーションの実行時間内でのセーブデータの整合性を保証します。

タイミングとフレームレートの正確なエミュレーション。 RuffleはFlash Playerの内部タイマーを正確にエミュレートします。これはゲームやアニメーションのロジックにとって重要です。これにより、イベント、サウンド、オブジェクトの動きの適切な同期が保証され、ゲームがオリジナルよりも遅くまたは速く動作する状況を防ぎます。

DOMおよびJavaScriptインタラクション(ExternalInterface)のサポート。 ActionScriptとJavaScript間でデータを交換するためにExternalInterface APIを使用した複雑なウェブアプリケーションのために、Ruffleは互換性のあるブリッジを実装しています。これにより、エミュレータは関数呼び出しとデータ転送を正しく処理し、周囲のウェブページとのコンテンツのインタラクティビティを維持できます。

自動スケーリングと解像度適応。 特定の解像度(例:800x600)向けに作成されたFlashコンテンツを再生する場合、Ruffleはブラウザまたはデスクトップアプリケーションの現在のウィンドウサイズに適応するためにスケーリングアルゴリズムを自動的に適用します。縦横比と画質を維持し、マウスインタラクション領域を正しく処理します。

多様なメディアフォーマットのサポート。 エミュレータは、SWFファイルに埋め込まれる可能性のある様々なメディアフォーマット(オーディオ圧縮用のMP3や、Flashの後期バージョンで使用されるビデオ圧縮を含む)のデコードをサポートしています。デコードはRustで書かれた高性能ライブラリを介して実行され、システム負荷を軽減します。

高度なデバッグとロギング。 開発者や上級ユーザー向けに、RuffleはAVM1/AVM2仮想マシン操作の詳細なログを有効にする機能を提供します。これにより、互換性の問題を診断し、ActionScriptコードのエラーを追跡し、より精密な調整のためにエミュレーションの内部プロセスを理解することができます。

カーソルとインタラクティブ要素のエミュレーション。 Ruffleは、Flashコンテンツによって指定されたカーソルスタイルの変更を正しく処理します。例えば、LoaderDisplayのようなインタラクティブな要素では、エミュレータは自動的に標準カーソルをポインタに変更し、元のFlashプレーヤーの動作を模倣して、ユーザーに使い慣れたナビゲーションを提供します。

早期アクセス用のNightlyビルドのサポート。 安定版リリースに加えて、Ruffleチームは毎日の実験的なNightlyビルドへのアクセスを提供しています。これらのビルドには、安定版にはまだ含まれていない最新の修正と革新が含まれています。

デジタル文化遺産の保存。 これは単なる技術的機能ではなく、プロジェクトの基本的な目標です。Ruffleは、歴史的なインターネットコンテンツを保存するためのツールとして作成されました。セキュリティを損なうことなく最新のブラウザで動作する能力のおかげで、Adobe Flash Playerの廃止後に永久に失われていたはずの何百万ものFlashゲーム、アニメーション、アプリケーションが、将来の世代のためにアクセス可能な状態を保っています。

Ruffleの知られざる12の技術的機能

  1. プライマリレンダリングバックエンドとしてのWGPUの使用。 レガシーなOpenGLに依存する多くのエミュレータとは異なり、RuffleはWGPUライブラリを使用します。これは、最新の、安全で、クロスプラットフォームなグラフィックスAPIです。デスクトップでは、WGPUは自動的に最適な低レベルバックエンド(Vulkan、DirectX 12、またはMetal)を選択します。ブラウザでは、WebGPU(利用可能な場合)を介して動作するか、最小限のパフォーマンス損失でWebGLを介して動作をエミュレートできます。

  2. 最大パフォーマンスのためのブラウザでのWebGPUサポート。 最新のブラウザ(例:ChromeとEdgeの最新バージョン)のユーザーは、Ruffleが最先端のWebGPU APIを使用できます。これにより、標準のWebGLバックエンドと比較して、シェーダーコンパイル時間が大幅に短縮され、オーバーヘッドが低減されます。これは、複雑な3DグラフィックスやStage3Dアプリケーションにとって重要です。

  3. きめ細かなレンダリングバックエンドの調整(canvaswebglwgpu-webgl)。 レンダリング動作を手動で制御できることを知っている人はほとんどいません。標準のwgpu-webglに加えて、強制的に有効にするオプションがあります:

    • webgl — 起動が速く、複雑なビットマップ効果を必要としないシンプルなコンテンツに役立つ可能性がある従来のバックエンド。

    • canvas — 最も遅いですが、最も正確なバックエンドです。これは、ハードウェアアクセラレーションを使用すると太く見えすぎる可能性がある、ベクターグラフィックスのヘアラインストロークを正しくスケーリングできる唯一のバックエンドです。

  4. Stage3DのエミュレーションとAGALからWGSLへのコンパイル。 Ruffleは2Dグラフィックスだけでなく、Stage3D(Context3D)APIを介した3Dアクセラレーションもサポートしています。AGAL(Adobe Graphics Assembly Language)で書かれたシェーダーは、最新のWGSL(WebGPU Shading Language)またはGLSLに「オンザフライ」でコンパイルされます。これにより、Flash Player 11以降向けに作成された複雑な3Dゲームやアプリケーションを、プログラム可能なシェーダーの完全なパイプラインを利用して実行できます。

  5. 後方互換性のためのfscommandのサポート。 Ruffleは、レガシーではあるが重要なfscommandメカニズムのサポートを維持しています。これにより、古いFlashムービー(ExternalInterface以前に作成されたもの)が、任意のコマンドと引数を送信して、ページ上のJavaScriptと対話できるようになります。Ruffleの最新の実装では、これらのコマンドはonFSCommandを介して処理され、非常に古いウェブコンテンツでも機能性を可能にします。

  6. Context3Dのためのダブルバッファリング。 3Dコンテンツを扱う場合、Ruffleは高度なダブルバッファリングメカニズム(バックバッファ/フロントバッファ)を使用します。これは標準的ですが、非常に重要なパフォーマンス向上技術であり、現在のフレームが画面に表示されている間に次のフレームをバックグラウンドバッファでレンダリングすることを可能にし、動的なゲームにおける視覚的アーティファクト(フレームのティアリング)を排除します。

  7. ベンチマークツール:ruffle_scannerexporter Ruffleリポジトリ内には、標準ビルドには含まれていないが開発者が利用できるユーティリティツールがあります:

    • ruffle_scanner — SWFファイルのフォルダ全体に対するエミュレータの互換性をテストし、解析成功に関するCSVレポートを生成できます。

    • exporter — SWFファイルからPNGスクリーンショットをバッチ生成するためのツールで、GUIなしのヘッドレスモードで実行でき、自動テストやプレビューの作成に役立ちます。

  8. Flatpakサンドボックスによる完全な分離。 Linuxユーザー向けに、Flatpak形式での公式Ruffleビルドがあります。これは単なるインストール方法ではなく、追加のセキュリティレイヤーです。アプリケーションは分離された環境で実行され、すべての保存データ、設定、ログはFlatpakホームディレクトリ(~/.var/app/rs.ruffle.Ruffle/)内に厳密に保存され、システムの他の部分にアクセスすることはありません。

  9. HomebrewとScoopによる統合サポート。 経験豊富なユーザー向けに、Ruffleは手動ダウンロードを超えた高度なインストール方法を提供しています。macOSでは、Homebrewbrew install --HEAD ruffle-rs/ruffle/ruffle)を介してインストールでき、最新のナイトリービルドへの自動更新が可能です。Windowsでは、Scoopパッケージマネージャーが同様の機能を提供します。

  10. 透過的なデータストレージシステム(SharedObjects)。 Ruffleは、Flashローカルストレージシステム(LSO — Local Shared Objects)を正確にエミュレートします。ただし、独自のプレーヤーとは異なり、これらのファイルの場所は標準化されており、ユーザーにとって透過的です。Windowsでは%AppData%\Local\Ruffle\SharedObjects\、Linuxでは~/.local/share/ruffle/SharedObjects/に配置されます。これにより、古いゲームのセーブデータを手動でバックアップできます。

  11. JavaScript APIとグローバル設定による設定。 ウェブ開発者向けに、Ruffleは強力なJavaScript APIを提供しており、プレーヤーの埋め込みだけでなく、その状態の制御も可能にします。プログラムによるSWFのロード(load)、ボリューム制御(volume)、一時停止(suspend/resume)、およびtraceObserverを介したデバッグ用のActionScriptからのtrace()出力のインターセプトなどのメソッドが利用可能です。

  12. macOSビルドの自動署名とノータリゼーション。 CI/CDプロセスでは、macOS用のすべてのRuffleナイトリービルドがAppleによるコード署名とノータリゼーションを受けています。これは、エミュレータの不安定なバージョンであっても、Gatekeeperによって安全でないソフトウェアとしてブロックされず、セキュリティ要件が厳しい最新バージョンのmacOSでの問題のない動作を保証することを意味します。