Repository navigation
Releases
Lost Odyssey Steprant Android 2.1
Steprant Android 2.1 — release notes. Download the Android 2.1 APK · Release notes in the repository. On Adreno, use the Mr. Purple T30 GPU driver. See section 3.
Branch steprant/v2.1, versionCode 2010000. The 2.1 build uses the gameplay code tested as 2.0.8 (“Sync”, 12 November 2026).
An independent Android edition maintained by Steprant, based on the official Lost Odyssey Recomp v1.1.0 by Frank / freefrank and the original community. 2.1 installs over 1.8, 2.0 and every 2.0.x test build (same package and signing key) and keeps saves, settings and the shader cache.
All figures were measured on one device: Xiaomi 14, Snapdragon 8 Gen 3, Adreno 750, 2670×1200 panel, 30 FPS, with the in-game Tester. Results depend on device, driver, scene and settings.
1. Results at a glance
Section 5 names the sessions behind the numbers.
The same measurements as the 1.8 table, now from 1.1 to 2.1. "1.1" is the "Before" of the 1.8 table: the first Steprant builds and the 1.7 test builds.
| What was measured | 1.1 | 1.8 | 2.1 | Change 1.1 → 2.1 |
|---|---|---|---|---|
| Frames over 50 ms per minute, city / open field | 18.2 / 20.7 | 6.2 / 10.0 | 3.7 in normal play (1) | −80% / −82% |
| 99th percentile frame time, city / open field | 48.5 / 51.2 ms | 37.5 / 39.0 ms | 37.6 ms in normal play (1) | −22% / −27% |
| GPU time per frame: native 2403×1080 → SGSR2 (1780×800 in 1.8, 2003×900 in 2.1) | ~23 ms | 16–17 ms | 15.4–16.0 ms (1) | −30 to −33% |
| GPU occupancy at 30 FPS: native 1080 → SGSR2 Quality | 81% | 66–74% | 46–48% (1) | −41 to −43% |
| Render passes per frame | 100% | ~60% | ~60% | −40% |
| GPU time inside render passes | 100% | ~92% | ~85% (2) | −15% |
| Render passes split by an EDRAM resolve, city / open field | 14.7 / 15.0 | 7.1 / 8.6 | 7.0 (1) | −52% / −53% |
| Hitches caused by resolution switches at menus, loading screens and fades | 40–300 ms each | none | none | −100% |
| GPU occupancy in menus (1) | ~60% | 28–40% | 11–24% | −60 to −82% |
| XMA audio decode errors | 12–14 thousand in a second | 56–150 per session | 11 in 8.5 minutes | over −99% |
| Audio queue running empty (1) | 74–91 per session | 0 | 0 in play (9 in the first seconds of startup) | −100% in play |
| Shadow casters with dynamic shadows on Low | 8 | 16 | 16 | ×2 |
| Memory per pixel of 8-bit render targets | 8 bytes | 4 bytes | 4 bytes | −50% |
(1) Different sessions and scenes, before and after; indicative. 2.1 GPU figures were measured with the recommended driver (section 3). (2) Estimate: the −8% of 1.8 followed by the 2.0 frame graph (−4 to −9% GPU time per frame); not measured as one number.
Also measured in 2.1
| What was measured | Before | 2.1 | Change |
|---|---|---|---|
| Pixels rendered at 900p with SGSR2, phone / TV (1.8) | 1780×800 / 1280×720 | 2003×900 / 1600×900 | +27% / +56% |
| Frames shown without anti-aliasing when SGSR2 cannot upscale (1.8) | all of them | none (SMAA) | −100% |
| Opening the settings menu over the game (1.8) | 113–137 ms | 9.4 ms | −93% |
| Longest audio callback stall (1.8) (1) | 705 ms | 84 ms | −88% |
| Audio behind the picture after a stall (1.8) | stays behind | caught up | fixed |
| Stores to memory that nothing reads (1.8) | all kept | 48–54 MB less per frame | −93% |
| Split-screen scenes with two cameras (2.0) (1) | ~12 FPS | ~20 FPS | +67% |
| Peak GPU memory with phone ↔ TV switches (2.0) (1) | 2,592 MiB | 2,336 MiB | −10% |
Reading the table honestly:
- The GPU row mixes render sizes: the first builds rendered at native 1080 (2403×1080), 1.8 at 1780×800, 2.0 and 2.1 at 2003×900, all at 30 FPS. 2.1 renders 31% fewer pixels than native 1080 and 27% more than 1.8. The same-scene driver comparison is in section 3.
- From 2.0.3 the Tester always records per-draw GPU timestamps, which add their own cost: the 2.0.x and 2.1 GPU times are, if anything, slightly high.
- In the sampled gameplay, 2.1 renders 27% more pixels than 1.8 with similar frame times.
- 2.1 frame pacing: whole session of 12 November 17:03 without the split-screen scene, p99 41.2 ms and 6.7 frames over 50 ms per minute; normal play from 280 to 440 s, p99 37.6 ms and 3.7 per minute; a quiet stretch of the 2.0.7 session, 1.0 per minute. The remaining clusters are the game itself pausing (
cp_idleof 50–100 ms at loads and scene changes).
GPU load and battery use
On a Xiaomi 14 at 900p, SGSR2 Quality and 30 FPS with Mr. Purple T30, 2.1 used 15.4–16.0 ms of GPU time per frame in the sampled gameplay (46–48% of the frame budget). Battery draw and runtime still need direct measurement. The 1.8 release notes report about 60–65% GPU occupancy during gameplay at the 1.8 defaults, which used a lower internal render resolution. The two builds were recorded in different gameplay sessions.
2. Every improvement since 2.0, point by point
2.1 contains everything in the 2.0 release notes (frame graph, exact render areas, settings menu without stall, fast-forward rate cap, mosaic and shadow fixes, save points that restore HP and MP, EXP up to ×10, SGSR2 Soft, crash diagnostics, profile-guided build) and the 1.8 release notes. On top of 2.0:
GPU driver and presentation
- The driver page recommends Mr. Purple T30 on Adreno and names the verified driver (section 3).
- Four swap chain images on Android instead of three; the log line
video output:reports the real image count (images= requested=). → present calls over 10 ms: 25% → 0.8% of frames. - Interrupt and vblank threads prefer the big cores at a higher priority. Measured: interrupts wait 0.1 ms on average and almost never over 2 ms, so this changes little; it stays because it costs nothing.
Image
- SMAA on every frame the upscaler skips, in any cutscene: when SGSR2 cannot run (no scene camera, an incomplete scene), the frame goes through SMAA instead of plain spatial scaling. Seen in the children's cutscene, where 500–760 frames at startup had no scene camera.
- Scenes whose motion is not ready stay in SGSR2 (after loads and at cuts): zero motion and fresh history, same anti-aliasing and filter. SGSR1 hand-overs went from 39 in 8.6 minutes to 26 in 11.6 minutes (2.0.3), and with point 4 none of them lacks anti-aliasing.
- Loading screens and movies drawn at the output size from their first draw (860 frames in one session), and no promote/undo loop in menus.
Audio
- The game's audio catches up after a stall instead of staying behind the picture: the runtime measures the lag (wall-clock frames against the game frames played and still queued) and drops what is late. The measurement starts again on pause, device reopen, reserve change and fast-forward.
- No resync while the picture is frozen (loads, shader preparation, more than 100 ms without a present): audio and picture stop together there, so nothing is dropped.
- The game's audio worker gets audio priority while it mostly waits (under 10% of a core), and a middle priority when it works hard, so it does not take cores from the game during loads.
→ the desync of the guard-with-flowers and Jansen scenes is gone; in the 2.1 session the audio queue ran empty only in the first seconds of startup (9 times), and the longest callback stall was 84 ms.
Memory, menus, Tester
- Render targets parked at a phone ↔ TV switch are freed after 60 s if no new size takes them back (132 MB parked at one switch; peak GPU memory 2,592 → 2,336 MiB).
- Settings menu over the game: no reads of the upload buffer, unchanged images reused. → first frame 9.4 ms (about 115 ms per frame in the 2.0.1 test builds).
- Update check at the title screen on its own thread instead of at startup.
- Tester: one profile (the most accurate), Clear diagnostics with the freed MB shown, exports with only the current run's frame captures and profiles (a stale capture had made every export 130 MB; now under 1 MB).
- Diagnostics:
gpu sync:lines measure where the GPU command thread waits for the game.
3. GPU driver: play with Mr. Purple T30
On Adreno, play 2.1 with Mr. Purple T30 (PurpleVK 26.3.0-devel). 2.1 is tuned, tested and measured with this driver; the system driver and older Turnip builds are not the supported setup. The driver page offers it as the recommended download.
How: CTRL → GPU driver → Download recommended: Mr. Purple T30 → restart when asked. The package comes from MrPurple666/purple-turnip and is installed in the app's private storage; the system driver is untouched and can be chosen again from the same page.
First start: after any driver change the pipeline cache is rebuilt, which takes about 50 seconds in the background (51 s measured). Expect stutter in that first minute, once. From the second start the cache is warm (about 1.2 s).
Driver comparison (11 November 2026, app 2.0.5, same settings in all sessions: 900p, SGSR2 + SMAA, shadows ×2, 8× AF; gameplay frames with at least 800 draws, no movies, no pauses; for the new drivers the cold-cache first minute is excluded):
| Driver | GPU ms per frame, median (p90) | vs Mesa 26.0 | Main scene, µs per draw | GPU frames over 33 ms |
|---|---|---|---|...
Lost Odyssey Steprant Android 1.8
Download Steprant Android 1.8 APK · Android guide · Changelog
An independent Android edition maintained by Steprant, based on the official Lost Odyssey Recomp v1.1.0 by Frank / freefrank and the original community. 1.8 collects everything since the first Steprant build and installs over 1.5, 1.6 and 1.7 test builds (same package and signing key).
All figures below were measured on one device: Xiaomi 14, Snapdragon 8 Gen 3, Adreno 750, Turnip Mesa, 2670×1200 panel, 30 FPS, with the in-game Tester. Each row compares sessions on the same maps and settings unless noted. Results depend on device, driver, scene and settings.
Results at a glance
| What was measured | Before | 1.8 | Change |
|---|---|---|---|
| Frames over 50 ms per minute, city (900p, SGSR2 Quality) | 18.2 | 6.2 | −66% |
| Frames over 50 ms per minute, open field (same settings) | 20.7 | 10.0 | −52% |
| 99th percentile frame time, city | 48.5 ms | 37.5 ms | −23% |
| 99th percentile frame time, open field | 51.2 ms | 39.0 ms | −24% |
| GPU time per frame: 2403×1080 native → 1780×800 + SGSR2 (same session) | ~23 ms | 16–17 ms | −26 to −30% |
| GPU occupancy at 30 FPS: native 1080 → SGSR2 Quality (same session) | 81% | 66–74% | −9 to −19% |
| Render passes per frame (depth-only draws kept in the scene pass) | 100% | ~60% | −40% |
| GPU time inside render passes (same change) | 100% | ~92% | −8% |
| Render passes split by an EDRAM resolve, city | 14.7 | 7.1 | −52% |
| Render passes split by an EDRAM resolve, open field | 15.0 | 8.6 | −43% |
| Hitches at every menu, loading screen and fade (resolution switch) | 40–300 ms each | none: no switch | −100% |
| GPU occupancy in menus (1) | ~60% | 28–40% | −33 to −53% |
| XMA audio decode errors | bursts of 12–14 thousand in about a second, every session | 56 and 150 in whole sessions | over −99% |
| Audio queue running empty (1) | 74–91 per session | 0 | −100% |
| Shadow casters kept with dynamic shadows on Low | 8 | 16 | ×2 |
| Memory per pixel of 8-bit render targets (previously stored as 16-bit float) | 8 bytes | 4 bytes | −50% |
(1) Different sessions and scenes, before and after the change; indicative.
Not reduced in 1.8: GPU occupancy in gameplay at the new defaults stays at about 60–65% at 30 FPS. The gains above are in smoothness, image quality and redundant work, not in total GPU load; that is the target of 2.0.
Defaults on a fresh install
900p render resolution, Anti-aliasing → SGSR2 at Quality (SMAA before the upscale), shadow resolution ×2, 30 FPS. Existing settings files are kept as they are.
Every improvement, point by point
Smoothness
- Resolve copies wait for the end of the render pass (EDRAM emulation). A copy out of the active pass used to end it, store everything and reload it in the next pass; now it runs at the end of the pass whenever nothing in between touches the copied area. The copied pixels are identical. → −43 to −52% passes split this way; together with the change below, −52 to −66% frames over 50 ms and −23 to −24% on the 99th percentile.
- Render passes begin over the drawn area instead of the whole target where the draws stay inside it; a pass that has to grow restarts once over the whole target (no repeated reloads).
- No resolution switch in menus, loading screens and fades (also the boot title): the interface is drawn at display resolution over the enlarged background. → every 40–300 ms hitch at those transitions removed; menu GPU load −33 to −53%.
- Render targets reused after a resolution switch and back (two sizes per kind, 512 MB budget): switches now happen only when you change settings.
- Display refresh follows the game frame rate (the 120 Hz panel runs at the game's pace).
- A breakdown of every frame over 50 ms in the Tester log (guest idle, GPU wait, present stage, pacing), to find the remaining ones.
GPU work
- Qualcomm SGSR2 temporal upscaling (Anti-aliasing → SGSR2, Quality/Balanced/Performance/Native AA): renders at 1/1.5–1/2 of the output and reconstructs it from jitter, depth and camera motion. → −26 to −30% GPU time per frame against native 2403×1080 in the same session.
- Depth-only draws stay in the scene's render pass and run their vertex shaders without unused outputs. → −40% render passes, −8% GPU time in passes.
- Early depth rejection kept (Adreno LRZ): pixel shaders keep early depth testing unless the game enables the alpha test. Existing shader packs stay valid.
- Compact render targets: 8-bit and 10-bit targets live in 8-bit/10-bit memory instead of 16-bit float. → −50% memory per pixel on those targets; their pipelines are prepared at startup.
- Attachments with undefined contents are no longer loaded.
- Earlier work retained: redundant resolve barriers, covered clears, read-only depth draws, descriptor and pipeline lookups, shadow bookkeeping.
Image quality
- SMAA in SGSR2 Quality: edges are smoothed on the render-size image before the upscale; no extra sharpening pass. Scene textures keep output-resolution detail (mip bias).
- Shadows with SGSR2/TAA: no grid of blocks in shadowed areas. Every shadow-projection shader that rebuilds its receiver gets the jitter correction; any other stays unjittered.
- Dynamic shadows on Low keep 16 casters on Android instead of 8 (×2): NPC shadows no longer disappear.
- SSAO no longer draws stripes on the sky and distant terrain.
- Qualcomm SGSR1 spatial upscaling in the Vulkan SDR presentation path; it stays enabled after a swapchain format change, and the overlay shows whether it is active and its sizes. Checked pixel by pixel against Qualcomm's algorithm: maximum error 2/255.
- 576p and 900p render resolutions; full-screen 2D layers cover the whole width on displays wider than 16:9; the title screen's mesh pattern is no longer drawn.
Audio
- XMA error bursts removed: a voice whose frames keep failing resynchronises on the next packet and then plays silence instead of retrying thousands of times a second. → from 12–14 thousand errors in about a second to 56–150 in a whole session.
- XMA decoder on performance cores at audio priority; it no longer holds its lock for a whole voice.
- No AAudio reopen on every return from the background; queue-reserve recovery and stall protection. → audio queue empty 0 times in the measured sessions (74–91 before).
- 64 ms audio buffer on Android.
CPU and build
- The Android runtime is built for ARMv8.2-A (inline LSE atomics; Snapdragon 845 and later). No separate gain is claimed.
Android, TV and extras
- TV / HDMI: independent external output, 16:9 fitting, 720p/1080p requests, controller forwarding; phone blackout returns 10 s after the last touch.
- MediaCodec H.264 replacement movies, with the original video on failure.
- EXP ×2 and SP ×2 quick-tool switches (LB+RB → Cheats → Quick tools).
- Graphics preset Mobile 30 FPS (1080 internal, SGSR1, low shadows).
- Cleaner settings: the development A/B rows are removed and the confirmed behaviour is built in.
- New launcher icon; the edition is named on the title screen above the upstream credit.
Diagnostics (Tester)
- Bounded recordings with ZIP export: frame, CPU, thread, GPU, thermal and memory samples; per-render-pass GPU profile; GPU time by draw type and most expensive shaders; attachment load/store census; why render passes end; a breakdown of every frame over 50 ms.
tools/android/compare-tester.pycompares two recordings.
Known limits
- GPU occupancy in gameplay is unchanged at about 60–65% at 30 FPS; 60 FPS at these settings is not reached yet.
- Some light effects look blocky at high resolution: the game draws them into small buffers.
- Some slow frames remain at scene changes and in the city (about 6–10 a minute).
- Tested on one device; HDMI/audio routing and A/V synchronisation on other devices are not verified.
Installation and verification
Android 8.0+, ARM64, Vulkan. Package io.github.freefrank.lostodyssey.steprant, launcher Lost Odyssey Steprant, signing certificate SHA-256 ecaadcdc715ff7e4aeaaf265ec11f1854d4039175dbc7e53fd4f86fd03af6f3f. It coexists with the official app; saves and settings are separate. CI checks: native ARM64 build, JVM tests, lint, APK Signature Scheme v2, alignment, host regression tests and Vulkan (lavapipe) readbacks.
Credits and game data
Thanks to Frank / freefrank and the original community for Lost Odyssey Recomp. This is an unofficial Android fork. The runtime remains GPL-3.0; dependencies keep their notices, including Qualcomm SGSR (BSD-3-Clause) and Intel XeGTAO (MIT). Supply supported game data from your own discs; no game data is included.
APK SHA-256: 44dc2632220945e33926102ca92069f7239ddd57e6c8bd96a83c1cb177497de9 (LostOdyssey-Steprant-v1.8-20261108.apk, built from commit 6b5fe4873dc03ca703a947477d8c32287ce0d3b2)
Lost Odyssey Steprant v1.1.0 — Android SGSR1 & Audio
An Android-focused build based on Lost Odyssey Recomp v1.1.0, focused on sustained performance, thermals and battery efficiency. Results vary by device and settings.
What's new
- Qualcomm SGSR1: optional Vulkan SDR upscaling. Enable Settings → Graphics → SGSR1, choose the High scaling filter and render below the output resolution (for example, 720p to 1080p); save and restart.
- TV / HDMI: independent external display output, 16:9 fitting, 720p/1080p requests, controller support and optional phone dimming.
- Android performance: renderer and CPU changes targeting redundant work, with an in-game tester for frame timing, audio queues and available thermal and battery information.
- Audio: queue recovery, AAudio stall detection and XMA scheduling changes. Playback has improved, though some audio disturbances remain; A/V sync requires further checking.
- More: MediaCodec support for replacement movies, HDR work, extra debug-menu skills and a distinct Steprant icon.
Installation
Install the Android ARM64 APK on Android 8.0+ with Vulkan and supply your own supported game data. The package io.github.freefrank.lostodyssey.steprant installs separately from the official app. Private saves and settings are separate; export/import saves if needed.
APK SHA-256: 5072c0f05457c5fa4247971a1685cd6bd41eaedeccdd92ea490b83b8fe88a99e
Build provenance: the native runtime reports ffadae541193-dirty; the precise differences in the local build tree have not been established. This release tag points to the integration branch and includes subsequent documentation and test changes.
Full Android update. General improvements have been proposed upstream in SGSR1 #717, AAudio #767, and audio #769.
Lost Odyssey Steprant Android 1.5
Download Steprant Android 1.5 APK · Android guide · Full verification
An independent Android edition maintained by Steprant, based on the official Lost Odyssey Recomp v1.1.0 by Frank / freefrank and the original community. Steprant 1.5 uses its own app version, icon and package.
Included in 1.5
- Qualcomm SGSR1: optional spatial reconstruction in the Vulkan SDR presentation path. Enable Settings → Graphics → SGSR1, choose the High scaling filter and an input resolution below output, such as 720p → 1080p, then save and restart. Native-size output, downscaling, HDR and temporal-upscaler output retain their normal paths. SGSR1 is not frame generation.
- TV / HDMI: independent 16:9 external output, 720p/1080p requests and controller forwarding. With phone blackout enabled, touching wakes the phone and blackout returns 10 seconds after the last touch, without covering the TV image. The phone panel remains powered.
- Extreme Tester: the Intensive profile records until manually stopped or an I/O/storage error, with no two-minute time limit. Configurable 250–2000 ms process sampling, bounded traces/ZIP export, process-memory samples and an estimated 1% low accepted-present rate. Thermal/battery data depends on Android; diagnostic recording can add overhead.
- EXP ×2 and SP ×2: independent saved switches in LB+RB → Cheats → Quick tools. EXP retains the game's per-battle cap; SP doubles victory skill points before learning. Gold and existing skill progress are unchanged.
- Audio fixes: queue-reserve recovery, AAudio reopen protection and XMA scheduling corrections are retained. 1.5 corrects an unsigned-wrap value in guest-wait diagnostic logs. Some crackling/audio disturbances remain; A/V synchronization requires device testing. The logging correction does not establish a new audio root-cause fix.
- Android performance work: renderer and CPU changes target redundant barriers, covered clears, descriptor/pipeline lookups and shadow bookkeeping. Lower CPU/GPU load, heat and battery consumption are optimization goals. No measured whole-game FPS uplift, temperature reduction or battery-life gain is claimed for 1.5.
APK and installation
LostOdyssey-Steprant-v1.5-20261104.apk — 47,694,826 bytes. Requires Android 8.0+, ARM64 and Vulkan.
Manifest: versionName 1.5 / versionCode 1050000. Package: io.github.freefrank.lostodyssey.steprant; launcher: Lost Odyssey Steprant, with the Steprant icon. It can coexist with the official app; saves and settings are separate. Future Steprant updates must retain the same signing key.
APK SHA-256:
4b809aea520746a3b2cba56eb0ab49461914a645ab9967d8f37fe4e8f6f0871f
Verification and remaining limits
The public download was checked again on 5 November 2026. The computed SHA-256 matches GitHub's asset digest; ZIP/ARM64 structure, APK v2 signature, manifest identity/version and 16 KB alignment pass. The signed release APK uses this fork's Android debug certificate, SHA-256 ecaadcdc715ff7e4aeaaf265ec11f1854d4039175dbc7e53fd4f86fd03af6f3f.
Prior build validation reports a complete ARM64 native build, 82 JVM tests, 15 host tests, 8 SGSR1 shader variants, Android TV probe checks and lint. These are build/synthetic checks, not newly repeated gameplay tests. No physical Xiaomi 14 gameplay run was performed for this publication check. Stable 60 FPS, HDMI/audio routing, A/V synchronization and power/thermal improvements need actual-device validation. The November 4 1080-internal-to-720-output traces do not demonstrate SGSR1 upscaling.
The native runtime embeds faf4842d87a6-dirty, indicating local build changes; a bit-for-bit reproduction from the release tag is not established. Hosted APK compilation remains blocked without authorized private build inputs; see the workflow findings.
Credits and game data
Thanks to Frank / freefrank and the original community for Lost Odyssey Recomp. This is an unofficial Android fork. The runtime remains GPL-3.0; dependencies retain their notices, including Qualcomm SGSR1.
Supply supported game data from your own discs. No game input or private diagnostic archive is attached.