Releases: Xget7/splatkit-android
Release list
SplatKit Android 0.1.0 alpha06 — Mi 9 validated
Fixes Adreno 640 duplicate-key corruption in alpha05 and avoids processing empty LOD visibility workgroups.
No resolution or LOD-quality thresholds changed by the visibility optimization.
Physical Mi 9, house 2M loaded, SH0, 1080x2261, 30-second turns:
- Full source: 19.2 FPS; prior LOD: 24.0 FPS.
- Optimized LOD: 41.4 FPS / 23.9 ms GPU in two runs; ~45k–125k drawn.
- Visibility: 19.15 → 1.81 ms sampled mean; process PSS snapshot ~566 MiB.
152 GPU radix cases through 3M passed; visibility, LOD and indirect ordering passed.
App validation covered SPZ, preprocessed LOD and background/resume.
159 core/engine tests and 14 harness tests passed locally.
An independent minified host builds against the attached CI AAR; native code and license notices are packaged.
Reproduction settings and measurements.
Stage means are sampled, not all-frame averages.
LOD remains approximate; no universal FPS, perceptual acceptance or sustained thermal certification.
Maven coordinate: io.github.xget7:splatkit-android:0.1.0-alpha06.
Central publishing status; use the attached AAR while publication propagates.
SplatKit Android 0.1.0 alpha05
Android native GPU integration
Experimental alpha for Android API 29+, Vulkan 1.1, arm64-v8a.
- GPU LOD → visibility/compaction → stable radix → indirect hardware drawing, with runtime capability/memory gates and bounded CPU compatibility fallback.
- Offline
.lodsplat, SH0–3, native walk/fly input and live loaded/drawn diagnostics. - Source, concise API/contracts and agent harness included. iOS Metal SDK: SwiftPM alpha.2.
The attached AAR is the GitHub Actions build of the reviewed source; its SHA-256 is attached separately.
An isolated host compiled and packaged a minified release APK against this AAR, without the SDK source module.
Maven coordinates: io.github.xget7:splatkit-android:0.1.0-alpha05.
Publication status: release workflow.
The publishing workflow succeeded; public Maven availability was still pending at verification. Use the attached verified AAR until Central serves the new version.
Evidence: Android AAR/APK/JVM builds, core/engine/iOS tests and C++ lint; 128 stable-sort cases through 3M, visibility, LOD-to-indirect and upload-pressure checks on Android arm64 emulator/MoltenVK/M4 Pro. Native GPU suites had validation layers unavailable; kitchen 500k app rendering had layers enabled with no captured validation errors.
This is not physical Android performance acceptance. LOD parents, subpixel rejection and optional 16-bit depth are approximations. Vulkan supports at most 3M visibility survivors and 2.2M selected LOD nodes; source residency depends on driver/memory limits. Hybrid compute screen tiles and RN GPU controls remain pending. No universal 10M/30/60 FPS or lossless claim.
SwiftShader's large mapped-upload crash was reproduced before shaders and independently of SDK code; use a working Vulkan driver. Physical Adreno/Mali, lifecycle stress and reference-image comparisons remain acceptance work.
0.1.0-alpha04
First release with the engine split into modules and the harmonics degree chosen per frame.
What changed since alpha03
- Spherical harmonics degree per frame. A quality preset now sets
shDegree, the degree drawn, and it takes effect on the next frame; switching presets never reloads the world.maxShDegreestays as the memory cap applied at load. Measured on the 2.6M bicycle: degree 3 costs 9 percent of GPU time over degree 0 in portrait, 30 percent in landscape. - Cull margin that scales with the frame time. The margin kept drawn around the view grows with the turn rate and the time a cull takes to reach the screen, so a fast flick on a slow scene no longer shows an empty edge.
- Engine modules (ADR 0013).
splat-coregains a file mapper, a world loader, the visibility policy and timing summaries, each with unit tests that run without a GPU; the Android side gains a surface renderer, a benchmark and a stats publisher, and the engine runs the frame in under 300 lines. - Hardened loading. Truncated or corrupt files, and failed swapchain rebuilds, report through the listener instead of crashing.
clang-formatandclang-tidyfrom the pinned NDK run on every pull request.ply2spz, an offline converter from Gaussian splat PLY to SPZ, with--drop-overto leave out oversized splats.- Image quality checked against the PlayCanvas renderer (the engine behind superspl.at) at the same pose, field of view and resolution: within 7 percent on an edge sharpness metric with the same data; the numbers are in
docs/BENCHMARKS.md.
Numbers, Xiaomi Mi 9 (Adreno 640), release build, 1080x2261
| Scene | Preset | GPU ms mean / p50 / p95 |
|---|---|---|
| Pool, 1.79M splats | MEDIUM | 20.8 / 18.1 / 31.1, 55 fps |
| Bicycle, 2.6M splats, harmonics degree 3 | HIGH | 18.9 / 13.7 / 45.2 |
| Bicycle, 2.6M splats, harmonics degree 0 | HIGH | 17.2 / 13.8 / 39.0 |
Install
implementation("io.github.xget7:splatkit-android:0.1.0-alpha04")minSdk 29, arm64-v8a only.
See it
splatkit-pool-mi9.mp4 below: a 1.79M splat pool scene at the MEDIUM preset on the Mi 9, recorded with screenrecord, which takes GPU time from the frame (55 fps without the recorder, 33 to 36 with it).
Known limits
- Tested on one GPU, Adreno 640. Mali (Samsung, Pixel) is unvalidated: if you have one, running the dev app and attaching
adb logcat -s SplatKitto an issue is the most useful report right now. - SPZ only at runtime; PLY goes through
ply2spz. - Alpha API.
maxShDegreein the presets becameshDegreein this release. - Android only. The React Native binding (react-native-splatkit) compiles on iOS but has no engine behind it yet.