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의 웹 버전에는 페이지의 DOM 구조에서 object, embed 및 applet 요소와 .swf 확장자를 가진 파일을 스캔하는 JavaScript 감지기가 포함되어 있습니다. 이러한 콘텐츠를 감지하면 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는 컴파일 타임에 메모리 안전성을 보장하여 버퍼 오버플로, 이중 해제, 해제 후 사용 오류 등 원래 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 파일을 열고 재생할 수 있습니다.这使得 에뮬레이터는 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 플레이어의 동작을 모방하고 사용자에게 친숙한 탐색을 제공합니다.
조기 액세스를 위한 나이틀리 빌드 지원. 안정적인 릴리스 외에도 Ruffle 팀은 매일 실험적인 나이틀리 빌드에 대한 액세스를 제공합니다. 이러한 빌드에는 안정적인 버전에 아직 포함되지 않은 최신 수정 사항과 혁신이 포함되어 있습니다.
디지털 문화 유산 보존. 이것은 단순한 기술적 기능이 아니라 프로젝트의 근본적인 목표입니다. Ruffle은 역사적인 인터넷 콘텐츠를 보존하기 위한 도구로 만들어졌습니다. 보안을 손상시키지 않으면서 최신 브라우저에서 작동할 수 있는 능력 덕분에 Adobe Flash Player 지원 중단 이후 영구적으로 손실되었을 수백만 개의 Flash 게임, 애니메이션 및 애플리케이션이 미래 세대를 위해 계속 액세스 가능하게 유지됩니다.
Ruffle의 덜 알려진 12가지 기술적 기능
-
기본 렌더링 백엔드로 WGPU 사용. 레거시 OpenGL에 의존하는 많은 에뮬레이터와 달리 Ruffle은 WGPU 라이브러리(현대적이고 안전하며 크로스 플랫폼인 그래픽 API)를 사용합니다. 데스크톱에서 WGPU는 가장 최적의 저수준 백엔드(Vulkan, DirectX 12 또는 Metal)를 자동으로 선택합니다. 브라우저에서는 WebGPU(사용 가능한 경우)를 통해 작동하거나 최소한의 성능 손실로 WebGL을 통한 작동을 에뮬레이션할 수 있습니다.
-
최대 성능을 위한 브라우저 내 WebGPU 지원. 최신 브라우저(예: 최신 버전의 Chrome 및 Edge) 사용자의 경우 Ruffle은 최첨단 WebGPU API를 사용할 수 있습니다.这使得 표준 WebGL 백엔드에 비해 셰이더 컴파일 시간이 크게 단축되고 오버헤드가 낮아지며, 이는 복잡한 3D 그래픽 및 Stage3D 애플리케이션에 매우 중요합니다.
-
미세한 렌더링 백엔드 조정(
canvas,webgl,wgpu-webgl). 렌더링 동작을 수동으로 제어할 수 있다는 사실을 아는 사람은 거의 없습니다. 표준wgpu-webgl외에도 강제로 활성화할 수 있는 옵션이 있습니다:-
webgl— 더 빠르게 초기화되고 복잡한 비트맵 효과가 필요하지 않은 간단한 콘텐츠에 유용할 수 있는 클래식 백엔드입니다. -
canvas— 가장 느리지만 가장 정확한 백엔드입니다. 하드웨어 가속을 사용할 때 너무 두껍게 나타날 수 있는 벡터 그래픽의 헤어라인 획을 올바르게 스케일링하는 유일한 백엔드입니다.
-
-
Stage3D에뮬레이션 및AGAL을WGSL로 컴파일. Ruffle은 2D 그래픽뿐만 아니라Stage3D(Context3D) API를 통한 3D 가속도 지원합니다. AGAL(Adobe Graphics Assembly Language)로 작성된 셰이더는 현대적인 WGSL(WebGPU Shading Language) 또는 GLSL로 "즉시" 컴파일됩니다. 이를 통해 Flash Player 11 이상용으로 제작된 복잡한 3D 게임 및 애플리케이션을 실행할 수 있으며, 프로그래밍 가능한 셰이더의 전체 파이프라인을 활용합니다. -
하위 호환성을 위한
fscommand지원. Ruffle은 레거시하지만 중요한fscommand메커니즘에 대한 지원을 유지하고 있습니다. 이를 통해 오래된 Flash 무비(ExternalInterface 이전에 제작됨)가 페이지의 JavaScript와 상호 작용하여 임의의 명령과 인수를 보낼 수 있습니다. Ruffle의 현대적인 구현에서 이러한 명령은onFSCommand를 통해 처리되어 매우 오래된 웹 콘텐츠에서도 기능을 가능하게 합니다. -
Context3D용 이중 버퍼링. 3D 콘텐츠로 작업할 때 Ruffle은 정교한 이중 버퍼링 메커니즘(백 버퍼/프론트 버퍼)을 사용합니다. 이는 표준적이지만 매우 중요한 성능 기법으로, 현재 프레임이 화면에 표시되는 동안 다음 프레임을 백그라운드 버퍼에서 렌더링하여 동적 게임에서 시각적 아티팩트(프레임 찢김)를 제거합니다.
-
벤치마킹 도구:
ruffle_scanner및exporter. Ruffle 저장소 내에는 표준 빌드에 포함되지 않지만 개발자가 사용할 수 있는 유틸리티 도구가 있습니다:-
ruffle_scanner— 전체 SWF 파일 폴더에 대한 에뮬레이터의 호환성을 테스트하고 파싱 성공에 대한 CSV 보고서를 생성할 수 있습니다. -
exporter— SWF 파일에서 PNG 스크린샷을 일괄 생성하기 위한 도구로, GUI 없이(헤드리스 모드) 실행할 수 있어 자동화된 테스트 및 미리보기 생성에 유용합니다.
-
-
Flatpak 샌드박스를 통한 완전한 격리. Linux 사용자의 경우 Flatpak 형식의 공식 Ruffle 빌드가 있습니다. 이것은 단순한 설치 방법이 아니라 추가적인 보안 계층입니다. 애플리케이션은 모든 저장, 구성 및 로그가 Flatpak 홈 디렉토리(
~/.var/app/rs.ruffle.Ruffle/) 내에 엄격하게 저장되고 시스템의 나머지 부분에 액세스할 수 없는 격리된 환경에서 실행됩니다. -
Homebrew 및 Scoop을 통한 통합 지원. 숙련된 사용자를 위해 Ruffle은 수동 다운로드 이상의 고급 설치 방법을 제공합니다. macOS에서는 Homebrew(
brew install --HEAD ruffle-rs/ruffle/ruffle)를 통해 설치할 수 있어 최신 나이틀리 빌드로 자동 업데이트가 가능합니다. Windows에서는 Scoop 패키지 관리자가 유사한 기능을 수행합니다. -
투명한 데이터 저장 시스템(SharedObjects). Ruffle은 Flash 로컬 저장 시스템(LSO — Local Shared Objects)을 정확하게 에뮬레이션합니다. 그러나 독점 플레이어와 달리 이러한 파일의 위치는 표준화되어 있고 사용자에게 투명합니다. Windows에서는
%AppData%\Local\Ruffle\SharedObjects\에, Linux에서는~/.local/share/ruffle/SharedObjects/에 위치합니다. 이를 통해 오래된 게임의 저장 데이터를 수동으로 백업할 수 있습니다. -
JavaScript API 및 글로벌 설정을 통한 구성. 웹 개발자를 위해 Ruffle은 플레이어를 임베딩할 뿐만 아니라 상태를 제어할 수 있는 강력한 JavaScript API를 제공합니다. SWF를 프로그래밍 방식으로 로드(
load), 볼륨 제어(volume), 일시 중지(suspend/resume),traceObserver를 통한 디버깅을 위해 ActionScript의trace()출력을 가로채는 메서드를 사용할 수 있습니다. -
macOS 빌드의 자동 서명 및 공증. CI/CD 프로세스에서 macOS용 모든 나이틀리 Ruffle 빌드는 Apple의 코드 서명 및 공증을 거칩니다. 이는 에뮬레이터의 불안정한 버전도 Gatekeeper에 의해 안전하지 않은 소프트웨어로 차단되지 않음을 의미하며, 보안 요구 사항이 엄격한 최신 버전의 macOS에서 문제 없는 작동을 보장합니다.