Strata 0.2.2 for Minecraft 26.1
Curse Maven Snippet
What's new
Strata 0.2.2
Strata 0.2.2 reduces retained-frame, text-editing, CPU rasterization, and Minecraft presentation costs, and publishes a shared performance testkit for library and application developers.
Keep all Strata artifacts on version 0.2.2 and install the Fabric runtime for your exact Minecraft version.
Rendering and retained UI
- Clean timed frames reuse the current tree's callback capabilities instead of walking every passive node. Structural changes, time-aware callbacks, invalidation, and terminal cleanup retain their original behavior.
- Dense repeated image blits can use bounded pixel templates, including multi-texel patterns. Fractional or reflected transforms, mixed primitives, invalid grids, and patterns outside the admitted bounds retain the original drawing path.
- CPU composition avoids repeated coordinate/color calculations and reuses exactly equal sampled rows. Opaque, translucent, patterned, tinted, and clipped inputs keep their existing pixel equations.
- Minecraft presenters reuse unchanged frame inputs and shifted layers, omit wholly invisible portable inputs, bound raster regions to visible work, and share scratch pixels only within one preparation. Each native upload retains independent owned storage.
- Supported modern adapters use bounded lookup metadata to select the same source texels as CPU sampling. Minecraft 26.3 samples the source in the GUI pass; other supported modern adapters materialize an exact GPU output. Unsupported tint, cutoff, orientation, clipping, and legacy adapter combinations retain CPU fallback.
- Long TextField measurement and cursor positioning avoid repeatedly copying and measuring prefixes. Unicode scalar boundaries, custom-font metrics, native rounding, IME, selection, and input behavior remain intact.
- Resource identifier validation and remote value/tree processing reduce transient allocation while preserving admission limits, validation failures, and communication contracts.
Measured changes from 0.2.1
| Operation | Before (0.2.1) | After (0.2.2 candidate) | Time reduction (%) |
|---|---|---|---|
| Retained clean timed frame, Full HD | 0.578 µs | 0.062 µs | 89.3% |
| Fresh CPU composition, patterned 64×64 source, Full HD | 38.264 ms | 1.191 ms | 96.9% |
| Fresh CPU composition, translucent 1×1 source, Full HD, density 4 | 48.794 ms | 1.089 ms | 97.8% |
| Fresh CPU composition, translucent patterned 1024×1024 source, Full HD | 49.037 ms | 12.787 ms | 73.9% |
These are medians of three independent AverageTime runs per side. Time reduction is (Before − After) / Before × 100; positive values mean faster operations.
Ordinary Full-HD rasterization was nearly unchanged: 0.822 ms Before and 0.807 ms After (1.8% average-time improvement); the measured p95 values increased for the ordinary raster fixtures, so this is not a blanket speedup.
Fresh full-HD outputs still allocate about 8.3 MB per operation, and some sampled-image cases allocate roughly 8–19 KB more for bounded sampling scratch state.
Retained clean-frame allocation in this fixture remains about 112 B per operation.
The full comparison includes all 24 selected cases, p50/p95/p99, and allocation; remaining cost and regressions are tracked below.
These measurements use the actual Maven Central 0.2.1 JARs and the final optimized runtime source, with identical compiled fixtures, collector, JMH harness, machine, Java, and standard iteration settings.
They measure JVM retained-frame and fresh CPU-raster operations; they do not establish GPU completion time or a universal FPS improvement.
The complete comparison below records the selected matrix, conditions, binary identities, and remaining limits.
Shared performance testkit
The test-only artifact dev.s7a.strata:strata-performance-testkit:0.2.2 centralizes JVM collection, CPU/allocation/GC evidence, runtime work assertions, native presentation counters, and validated summaries/comparisons.
The multiplatform artifact is dev.s7a.strata:strata-performance-testkit-multiplatform:0.2.2.
Consumers provide their real UI or server fixtures, actions, readiness predicates, and expected work through the testkit contracts.
JVM measurement, validation, aggregation, and comparison run in Java without a Python runtime requirement.
Quick investigation and change-scoped selection have separate receipt identities and cannot replace standard acceptance.
The kit is a new optional testing dependency; existing screens do not need to adopt it to upgrade.
UI authoring guidance
The Strata skill keeps everyday component, modifier, content-slot, and state-ownership decisions in its entrypoint, with conditional references for inventory styling, remote extensions, and retained custom components.
Independent empty-project exercises cover standard controls, virtualized lists, shared application-local components, and an interactive primitive with its own drawing.
The authoring checks guide describes nine opt-in, type-aware Detekt rules covering retained-state creation and mutation, manual subscriptions, immutable modifier use and forwarding, parent-data placement, flat root counts, and runtime/opening boundaries.
Install dev.s7a.strata:strata-detekt-rules:0.2.2 through detektPlugins and enable the strata rule set with the compatible Detekt version.
The guide explains each rule with compiled incorrect and corrected examples and its detection limits; responsibility and rendered-tree review remain necessary.
Known limits and follow-up work
Performance depends on command composition and adapter support; some changing-image and list intervals still take longer despite lower allocation. Remaining work is tracked as general rendering and testkit issues:
- Sampling metadata allocation and transfer.
- Broader exact GPU sampled-image composition.
- Complex CPU portable preparation.
- Preparation-time increases in general presentation workloads.
- Duplicated ownership code across version adapters.
- GPU completion, upload-byte, cold-resource, and cross-device evidence.
Upgrade
Update Maven dependencies and the installed Fabric runtime together to 0.2.2.
Existing screen definitions and remote communication contracts require no migration from 0.2.1.
The supported Minecraft version matrix is unchanged.
Runtime diagnostics add an optional bounded node-record capacity; the existing no-argument monitoring API retains its defaults.
Complete performance comparison
This compares Maven Central 0.2.1 with the final optimized runtime source in commit dc0f0cf32bc900bbd313b6dc4c8b40cd034e84dd, merged as 9f7078cb3243b87b3be507b50c8c42ee061b7f46.
The candidate archives were built from that source before the release version change; only release metadata and documentation changed afterward.
The baseline is the actual public binary distribution, not an intermediate optimization PR.
Conditions and coverage
- Windows 11, amd64, 32 logical processors; OpenJDK 25.0.2. The same machine and Java were used on both sides, with no overlapping builds or other benchmark invocations.
- The same compiled JMH fixtures, harness, shared collector, generated parameter matrix, and external input archives. The shared kit verified actual parent/fork origins and preserved the measured target, harness, collector, and input archives.
- AverageTime and SampleTime each ran three independent invocations per side, with three one-second warm-up iterations, five one-second measurement iterations, one fork, one thread, microsecond units, and the GC profiler.
- All 24 selected cases completed in each invocation. Both modes passed shared-kit summaries and comparisons. The original complete historical corpus and its acceptance contract were unchanged.
- Retained timed frames and ordinary rasterization use all three registered viewports. Sampled rasters use both registered physical sizes, both densities, and opaque/translucent/patterned sources. Dense rasters use all three source resolutions and both alpha varieties.
- Source construction, resource acquisition and PNG/hash verification are outside measurement. All 21 raster fixture outputs matched public 0.2.1 byte-for-byte as deterministic PNGs.
The selected methods are RenderingBenchmark.cleanTimedUiSessionFrame, RenderingBenchmark.headlessRasterization, SampledRasterBenchmark.composition, and DenseSampledRasterBenchmark.composition.
Their unchanged public-contract fixtures live in quality/benchmarks.
The shared JmhWorkloadInventory expands the generated registry, JmhPerformanceRunner delegates execution to JMH, and PerformanceEvidenceCli validates and compares the independent receipts.
These measurements do not certify every feature, input combination, host, or future extension.
Results
Before is the public Maven Central 0.2.1 distribution. After is the optimized 0.2.2 candidate. Average time and allocation are the shared kit's medians of three independent per-run scores. Percentiles are its medians of three per-run SampleTime percentiles. Reduction (%) = (Before − After) / Before × 100. Positive values mean less time or allocation; negative values mean a regression. Percentages are rounded to one decimal place; 0.0% can include a small change. These figures describe this selected fixture matrix and host. They are not FPS measurements, significance tests, or CI thresholds.
Clean retained timed frames
An unchanged retained UI receives a new frame time. The viewport varies; no fresh full-screen raster is created.
| Condition | Before (µs/op) | After (µs/op) | Time reduction (%) |
|---|---|---|---|
| Compact (320×180) | 0.579 | 0.063 | 89.1% |
| Full HD (1920×1080) | 0.578 | 0.062 | 89.3% |
| Windowed (854×480) | 0.569 | 0.062 | 89.1% |
Percentile times use µs/op. Allocation uses B/op; lower values are better for both metrics.
| Condition | Metric | Before | After | Reduction (%) |
|---|---|---|---|---|
| Compact (320×180) | p50 | 0.600 | 0.100 | 83.3% |
| Compact (320×180) | p95 | 0.600 | 0.100 | 83.3% |
| Compact (320×180) | p99 | 0.800 | 0.200 | 75.0% |
| Compact (320×180) | Allocation (B/op) | 112 | 112 | 0.0% |
| Full HD (1920×1080) | p50 | 0.600 | 0.100 | 83.3% |
| Full HD (1920×1080) | p95 | 0.600 | 0.100 | 83.3% |
| Full HD (1920×1080) | p99 | 0.800 | 0.200 | 75.0% |
| Full HD (1920×1080) | Allocation (B/op) | 112 | 112 | 0.0% |
| Windowed (854×480) | p50 | 0.600 | 0.100 | 83.3% |
| Windowed (854×480) | p95 | 0.600 | 0.100 | 83.3% |
| Windowed (854×480) | p99 | 0.800 | 0.200 | 75.0% |
| Windowed (854×480) | Allocation (B/op) | 112 | 112 | 0.0% |
Ordinary fresh CPU rasterization
The ordinary rendering fixture produces a newly owned raster at each registered viewport. Average time is almost unchanged here, while sampled tail latency increases.
| Condition | Before (µs/op) | After (µs/op) | Time reduction (%) |
|---|---|---|---|
| Compact (320×180) | 20.402 | 20.904 | -2.5% |
| Full HD (1920×1080) | 821.937 | 806.867 | 1.8% |
| Windowed (854×480) | 126.701 | 126.704 | 0.0% |
Percentile times use µs/op. Allocation uses B/op; lower values are better for both metrics.
| Condition | Metric | Before | After | Reduction (%) |
|---|---|---|---|---|
| Compact (320×180) | p50 | 19.072 | 21.280 | -11.6% |
| Compact (320×180) | p95 | 24.096 | 42.560 | -76.6% |
| Compact (320×180) | p99 | 45.696 | 61.229 | -34.0% |
| Compact (320×180) | Allocation (B/op) | 230760 | 230808 | 0.0% |
| Full HD (1920×1080) | p50 | 758.784 | 784.384 | -3.4% |
| Full HD (1920×1080) | p95 | 1009.664 | 1128.448 | -11.8% |
| Full HD (1920×1080) | p99 | 1519.145 | 1662.075 | -9.4% |
| Full HD (1920×1080) | Allocation (B/op) | 8296526 | 8294814 | 0.0% |
| Windowed (854×480) | p50 | 117.248 | 131.328 | -12.0% |
| Windowed (854×480) | p95 | 159.488 | 291.328 | -82.7% |
| Windowed (854×480) | p99 | 243.200 | 361.472 | -48.6% |
| Windowed (854×480) | Allocation (B/op) | 1641801 | 1640089 | 0.1% |
Sampled-image CPU composition
A tinted, fractionally placed sampled image produces a fresh 16:9 output. Opaque/translucent inputs are 1×1 sources; patterned inputs contain spatially varying RGB values in a 64×64 source. Output width and final density vary independently.
| Condition | Before (ms/op) | After (ms/op) | Time reduction (%) |
|---|---|---|---|
| 1920px output width; opaque; density 1 | 36.471 | 0.958 | 97.4% |
| 320px output width; opaque; density 1 | 1.031 | 0.020 | 98.1% |
| 1920px output width; pattern; density 1 | 38.264 | 1.191 | 96.9% |
| 320px output width; pattern; density 1 | 1.028 | 0.052 | 94.9% |
| 1920px output width; translucent; density 1 | 48.416 | 1.089 | 97.8% |
| 320px output width; translucent; density 1 | 1.320 | 0.023 | 98.2% |
| 1920px output width; opaque; density 4 | 37.068 | 0.972 | 97.4% |
| 320px output width; opaque; density 4 | 1.061 | 0.020 | 98.1% |
| 1920px output width; pattern; density 4 | 36.725 | 1.197 | 96.7% |
| 320px output width; pattern; density 4 | 1.022 | 0.053 | 94.8% |
| 1920px output width; translucent; density 4 | 48.794 | 1.089 | 97.8% |
| 320px output width; translucent; density 4 | 1.318 | 0.024 | 98.2% |
Percentile times use ms/op. Allocation uses B/op; lower values are better for both metrics.
| Condition | Metric | Before | After | Reduction (%) |
|---|---|---|---|---|
| 1920px output width; opaque; density 1 | p50 | 36.635 | 0.920 | 97.5% |
| 1920px output width; opaque; density 1 | p95 | 37.942 | 1.180 | 96.9% |
| 1920px output width; opaque; density 1 | p99 | 39.149 | 1.761 | 95.5% |
| 1920px output width; opaque; density 1 | Allocation (B/op) | 8294906 | 8294701 | 0.0% |
| 320px output width; opaque; density 1 | p50 | 0.994 | 0.019 | 98.1% |
| 320px output width; opaque; density 1 | p95 | 1.118 | 0.026 | 97.7% |
| 320px output width; opaque; density 1 | p99 | 1.440 | 0.051 | 96.5% |
| 320px output width; opaque; density 1 | Allocation (B/op) | 230639 | 230664 | 0.0% |
| 1920px output width; pattern; density 1 | p50 | 36.766 | 1.165 | 96.8% |
| 1920px output width; pattern; density 1 | p95 | 38.211 | 1.577 | 95.9% |
| 1920px output width; pattern; density 1 | p99 | 39.296 | 2.142 | 94.5% |
| 1920px output width; pattern; density 1 | Allocation (B/op) | 8294920 | 8305542 | -0.1% |
| 320px output width; pattern; density 1 | p50 | 0.996 | 0.050 | 95.0% |
| 320px output width; pattern; density 1 | p95 | 1.171 | 0.066 | 94.4% |
| 320px output width; pattern; density 1 | p99 | 1.444 | 0.116 | 91.9% |
| 320px output width; pattern; density 1 | Allocation (B/op) | 230630 | 234976 | -1.9% |
| 1920px output width; translucent; density 1 | p50 | 48.431 | 1.059 | 97.8% |
| 1920px output width; translucent; density 1 | p95 | 49.676 | 1.657 | 96.7% |
| 1920px output width; translucent; density 1 | p99 | 50.578 | 2.270 | 95.5% |
| 1920px output width; translucent; density 1 | Allocation (B/op) | 8294989 | 8302446 | -0.1% |
| 320px output width; translucent; density 1 | p50 | 1.296 | 0.022 | 98.3% |
| 320px output width; translucent; density 1 | p95 | 1.475 | 0.041 | 97.2% |
| 320px output width; translucent; density 1 | p99 | 1.829 | 0.062 | 96.6% |
| 320px output width; translucent; density 1 | Allocation (B/op) | 230665 | 231960 | -0.6% |
| 1920px output width; opaque; density 4 | p50 | 36.504 | 0.959 | 97.4% |
| 1920px output width; opaque; density 4 | p95 | 38.008 | 1.483 | 96.1% |
| 1920px output width; opaque; density 4 | p99 | 39.460 | 2.002 | 94.9% |
| 1920px output width; opaque; density 4 | Allocation (B/op) | 8294910 | 8294730 | 0.0% |
| 320px output width; opaque; density 4 | p50 | 0.986 | 0.019 | 98.1% |
| 320px output width; opaque; density 4 | p95 | 1.143 | 0.026 | 97.7% |
| 320px output width; opaque; density 4 | p99 | 1.392 | 0.050 | 96.4% |
| 320px output width; opaque; density 4 | Allocation (B/op) | 230630 | 230696 | 0.0% |
| 1920px output width; pattern; density 4 | p50 | 36.438 | 1.325 | 96.4% |
| 1920px output width; pattern; density 4 | p95 | 37.614 | 2.191 | 94.2% |
| 1920px output width; pattern; density 4 | p99 | 38.967 | 2.556 | 93.4% |
| 1920px output width; pattern; density 4 | Allocation (B/op) | 8294908 | 8305574 | -0.1% |
| 320px output width; pattern; density 4 | p50 | 0.985 | 0.050 | 94.9% |
| 320px output width; pattern; density 4 | p95 | 1.102 | 0.065 | 94.1% |
| 320px output width; pattern; density 4 | p99 | 1.342 | 0.118 | 91.2% |
| 320px output width; pattern; density 4 | Allocation (B/op) | 230629 | 235008 | -1.9% |
| 1920px output width; translucent; density 4 | p50 | 48.366 | 1.038 | 97.9% |
| 1920px output width; translucent; density 4 | p95 | 50.246 | 1.478 | 97.1% |
| 1920px output width; translucent; density 4 | p99 | 53.269 | 2.031 | 96.2% |
| 1920px output width; translucent; density 4 | Allocation (B/op) | 8294989 | 8302478 | -0.1% |
| 320px output width; translucent; density 4 | p50 | 1.282 | 0.022 | 98.3% |
| 320px output width; translucent; density 4 | p95 | 1.443 | 0.031 | 97.8% |
| 320px output width; translucent; density 4 | p99 | 1.769 | 0.063 | 96.5% |
| 320px output width; translucent; density 4 | Allocation (B/op) | 230656 | 231992 | -0.6% |
Dense patterned-image CPU composition
A tinted, fractionally placed patterned image is composed over an opaque 1920×1080 destination. Both alpha variants use spatially varying RGB values. Source detail varies independently of output area.
| Condition | Before (ms/op) | After (ms/op) | Time reduction (%) |
|---|---|---|---|
| 1024×1024 source; opaque | 37.747 | 5.787 | 84.7% |
| 1024×1024 source; translucent | 49.037 | 12.787 | 73.9% |
| 256×256 source; opaque | 37.270 | 1.704 | 95.4% |
| 256×256 source; translucent | 49.049 | 2.593 | 94.7% |
| 64×64 source; opaque | 37.032 | 1.183 | 96.8% |
| 64×64 source; translucent | 48.996 | 1.381 | 97.2% |
Percentile times use ms/op. Allocation uses B/op; lower values are better for both metrics.
| Condition | Metric | Before | After | Reduction (%) |
|---|---|---|---|---|
| 1024×1024 source; opaque | p50 | 37.290 | 6.103 | 83.6% |
| 1024×1024 source; opaque | p95 | 39.073 | 7.161 | 81.7% |
| 1024×1024 source; opaque | p99 | 39.788 | 8.058 | 79.7% |
| 1024×1024 source; opaque | Allocation (B/op) | 8294960 | 8305536 | -0.1% |
| 1024×1024 source; translucent | p50 | 48.366 | 12.804 | 73.5% |
| 1024×1024 source; translucent | p95 | 49.860 | 13.885 | 72.2% |
| 1024×1024 source; translucent | p99 | 57.213 | 15.178 | 73.5% |
| 1024×1024 source; translucent | Allocation (B/op) | 8295043 | 8306627 | -0.1% |
| 256×256 source; opaque | p50 | 36.831 | 1.650 | 95.5% |
| 256×256 source; opaque | p95 | 38.407 | 2.109 | 94.5% |
| 256×256 source; opaque | p99 | 39.209 | 2.624 | 93.3% |
| 256×256 source; opaque | Allocation (B/op) | 8294958 | 8305548 | -0.1% |
| 256×256 source; translucent | p50 | 48.693 | 2.552 | 94.8% |
| 256×256 source; translucent | p95 | 50.070 | 3.129 | 93.8% |
| 256×256 source; translucent | p99 | 50.894 | 3.557 | 93.0% |
| 256×256 source; translucent | Allocation (B/op) | 8295042 | 8314290 | -0.2% |
| 64×64 source; opaque | p50 | 36.864 | 1.159 | 96.9% |
| 64×64 source; opaque | p95 | 38.342 | 1.503 | 96.1% |
| 64×64 source; opaque | p99 | 40.436 | 2.075 | 94.9% |
| 64×64 source; opaque | Allocation (B/op) | 8294956 | 8305541 | -0.1% |
| 64×64 source; translucent | p50 | 48.628 | 1.327 | 97.3% |
| 64×64 source; translucent | p95 | 50.397 | 1.726 | 96.6% |
| 64×64 source; translucent | p99 | 51.881 | 2.228 | 95.7% |
| 64×64 source; translucent | Allocation (B/op) | 8295042 | 8314282 | -0.2% |
Measured binary identities
<details> <summary>Artifact hashes and collector provenance</summary>Public archives were downloaded from Maven Central and checked against its SHA-512 sidecars before collection. SHA-256 below identifies the actual measured bytes.
| Side | Artifact | SHA-256 |
|---|---|---|
| Before | strata-api | 18c655f867f2219c0e753fdf5327edc89abba3be49f39fd677348aa3b6cee734 |
| After | strata-api | 8e9abdff92f0ef871f794ae918bc6263946e57f44b4d68b601a61241d07b2741 |
| Before | strata-runtime-core | 618068f5fd3f7bcd14b836f14b0afacecb84abd7897169db5dea9d6912de8fd4 |
| After | strata-runtime-core | 802c5a7f32e47d2bc162ad3f29a4771f3da2714bb5d5bede0893c7b44a4e4526 |
| Before | strata-runtime-headless | 4d592b3cb639525eaeaffdbedd07f02149e407a6be6e498c1350938cc95b372e |
| After | strata-runtime-headless | a007ee612f4009713934e18a2beffc7ccc96235fd7ef08c1fbb0967c481a44e2 |
Shared collector SHA-256: 39daae392e7c23d04374e61aefee6ab64e9b9fa74f29ffbc89b018d5d494b3ea.
Interpretation
These are JVM retained-frame and fresh CPU-raster costs. They do not measure Minecraft GPU completion or imply a universal FPS, allocation, or GC improvement. Larger patterns and translucent outputs remain represented in the complete table; the headline examples are not the entire corpus. Other loaded-client evidence found changing-image/list intervals with increased preparation time, and some image combinations still select CPU fallback. Those results used the preceding tested optimization baseline rather than public 0.2.1 and are not included as 0.2.1-relative gains here.
See the performance testkit for collection and acceptance contracts. Absolute timings are not CI pass/fail thresholds.
This mod has no additional files

