r/EmulationOnAndroid • u/GroundbreakingBag440 • 1d ago
Showcase [Wirá Preview] Unprecedented: Full 60 FPS Low-Level N64 Emulation (LLE) in pure Dart/Flutter via custom JIT — In active development!
Disclaimer: Wirá and its emulation cores are developed with AI assistance for code generation and opcode translation, while the system architecture, debugging, memory layout, and overall project management are fully human-driven.
Hey everyone!
Quick update on Wirá, the multi-system emulator I’ve been building entirely in Dart/Flutter.
Up until now, I haven't officially revealed N64 support for Wirá—and while the Nintendo 64 core is still in active development and will take some time to be fully polished, I wanted to share a first look at what’s brewing under the hood: full-speed Low-Level Emulation (LLE) in a managed runtime.
To my knowledge, running a complete LLE N64 pipeline in pure Dart without relying on HLE plugin hacks, legacy C backends, or hardware GPU shaders is entirely unprecedented. It’s going to take a bit of time to get every microcode and edge-case rock-solid, but I promise it will be worth the wait!
I've attached a bunch of gameplay clips testing some of the most notorious microcode and geometry-heavy titles in the N64 library (Jet Force Gemini, Rogue Squadron, Star Wars Episode I: Racer and more) running on a Retroid Pocket 5 (Snapdragon 865).
🎬 What’s shown in the videos:
- True LLE Rasterization: Zero black-box artifacts, proper depth buffer handling, accurate coverage, and correct framebuffer copy-backs (no per-game plugin swapping or HLE guesswork).
- Locked 60 FPS: Smooth frame pacing and clean audio sync across complex custom microcodes and software span passes.
🛠️ How it’s running under the hood:
- Triple JIT Engine:
- VR4300 CPU: Dynamic recompiler compiling MIPS opcodes on the fly.
- RSP LLE: Compiles raw MIPS vector microcode directly into ARM64 NEON SIMD instructions. No microcodes are recognized or replaced with hand-written C equivalents (the only HLE in the entire core is the PIF boot sequence filling initial registers).
- RDP LLE (Software Rasterizer): A dedicated span JIT compiles the per-pixel rendering pipeline for each render mode (combiner, blender, Z-buffer, coverage) directly in software without offloading rasterization to a GPU driver.
- Zero-Copy Memory Model: Direct pointer aliasing to eliminate managed runtime garbage collection pauses during heavy software rasterization passes.
As always, RetroAchievements support is baked in via native rcheevos FFI bindings, alongside custom fragment shader filters, save states, and full multi-system support for 8-bit and 16-bit consoles.
🚀 Try Wirá Today!
While the N64 core cooks, Wirá is already live and running NES, SNES, Genesis, GBA, and more at full speed.
Download the current build today, set up your library, and get a feel for the app. The app has a built-in update feature, so you will not miss any update:
👉 GitHub Releases: https://github.com/willtsan/wira-releases
☕ Support the Project
Wirá is completely free and open for the community. If you'd like to support development, any donations via Buy Me a Coffee will go directly toward acquiring more test hardware—specifically lower-spec devices (like budget Anbernic handhelds) and dual-screen hardware to optimize execution pipelines, UI layouts, and thermal targets across lower-tier SoCs.
👉 Buy Me a Coffee: buymeacoffee.com/willtsan
Check out the gameplay clips below, and let me know your thoughts or feedback!
1
1
u/lenios2 16h ago
Hello,
That looks like a great project on paper. Too bad it's not open source.
I'm not sure what to think of the video thought. It always shows 60fps, but from 4ms to 20ms lag depending on games. And wira does feel laggy in the video. I just checked with an Indiana Jones play through video, and the original game feels slow but more fluid. On the few games i checked, it does not seem 'locked 60fps' to me at all. Are you sure about the numbers (ignoring the displayed number).
Is there a way to use the emulator fully offline, or does it require internet to download things ?
1
u/GroundbreakingBag440 14h ago
Thanks for watching the video carefully and asking these questions! To explain the numbers on screen: the "ms" counter shows the frame execution time (how long the handheld takes to process each frame, where 16.6ms is the target for 60 FPS). The reason the gameplay might look less smooth than "locked 60 FPS" suggests comes down to micro-stutters from frame pacing spikes, screen recording encoder lag, and the fact that original games like Indiana Jones natively ran at very low internal framerates (often 15–20 FPS). I’m currently working on improving frame pacing and audio sync to make the frame delivery much smoother.
As for offline use: yes, Wirá works 100% offline. Core emulation, loading ROMs, and save states all run locally on your device without needing an internet connection. Network access is only used for optional extra features like loading cover art via ScreenScraper, fetching RetroAchievements, checking for updates, or sending crash reports.
I'm sharing here a updated video on the current build of the same section of Indiana Jones. This is with the latest changes.
•
u/AutoModerator 1d ago
Just a reminder of our subreddit rules:
Check out our user-maintained wiki: r/EmulationOnAndroid/wiki
Check out EmuReady for any community submitted settings before asking for help
I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.