Ruffle 0.6.0 adds NV12 video support and native 3D math

The open-source Flash emulator's latest update focuses on ActionScript 3 performance and video decoding.

Ruffle 0.6.0 adds NV12 video support and native 3D math
Ruffle / GitHub

The Ruffle project has released version 0.6.0 of its open-source Flash emulator, adding NV12 video support and native 3D math processing. The update is available now across PC, macOS, Linux, Android, and WebAssembly environments.

This release focuses heavily on ActionScript Virtual Machine 2 (AVM2), the engine responsible for running ActionScript 3 content. The developers have reimplemented a massive chunk of the Matrix3D class as native methods. Functions like recompose, decompose, append, and invert now run natively instead of relying on slower ActionScript interpretations. Moving these 3D calculations to native code is a clear performance win for later-era Flash games that pushed the boundaries of browser rendering.

NV12 video and FreeType fonts

Video playback gets a notable upgrade in this build. Version 0.6.0 introduces support for the NV12 pixel format. NV12 is a common format for hardware-accelerated video decoding, which improves how Ruffle handles embedded video streams in SWF files.

On the desktop side, the standalone emulator now includes a FreeType device font renderer. It sits behind a feature gate for now, but it paves the way for more accurate text rendering in games that rely on local system fonts rather than embedded typography. The update also implements several Flash automation classes and improves the behavior of the TextBlock releaseLines function.

The 0.6.0 release includes a sweeping round of core dependency updates. The web builds bump versions for packages like fast-uri, undici, and postcss, keeping the WebAssembly implementation aligned with current Node ecosystems. The developers also improved the accuracy of Number to String coercion and fixed a buggy behavior in the Vector3d nearEquals function that existed in the original Flash Player.

The ActionScript 3 hurdle

Mike Welsh started Ruffle in 2019, anticipating the official end-of-life for Adobe Flash Player in December 2020. Flash powered a massive era of internet culture, from early Newgrounds animations to the sprawling libraries of Armor Games and Kongregate. When Adobe pulled the plug, thousands of foundational web games became unplayable in modern browsers without severe security risks or dedicated, aging plugins.

Ruffle solves this by running SWF files through WebAssembly and WebGPU or WebGL. It translates the original Flash instructions into modern web standards, allowing browsers to run the content securely and natively. You do not need a plugin, and the user experience is nearly identical to the original Flash Player.

The project has grown into the default archival tool for the Flash era. The Internet Archive, Newgrounds, and Coolmath Games all integrate Ruffle directly into their platforms to keep their catalogs accessible.

The shift toward AVM2 accuracy in recent updates is particularly important. Early Ruffle builds handled ActionScript 1 and 2 well, which covered the golden age of early 2000s stick figure animations and simple arcade games. ActionScript 3, introduced in 2006, was a much more complex, object-oriented language that powered physics games, MMOs, and 3D titles. Getting AVM2 to full compatibility is the final major hurdle for complete Flash preservation.

I want to see how the new Matrix3D native methods affect performance in heavier ActionScript 3 games. Titles that used early 3D engines like Away3D or Papervision3D historically chugged in emulation, and native math operations are exactly what those engines need to run smoothly.