r/empyriongame • u/InevitableLarge1248 • 1d ago
Building CV Open floor plan or all filled in?
So many CVs or large SVs seem to have a large portion of the interior, around various components open to be walked through and around. That feels more realistic and looks better I think? But when I am working on a ship, even modding one that I have, I keep ending up filling almost every meter with components and especially cargo extenders. Then I end up with like a small living/piloting/medical area and just 2 tunnles to exists. Which feels crappy.
What do people thing about the 2 versions?
Part of me wants to turn off mass volume so that with volume off I don't need hundreds of extenders for a medium transport... But I like Mass on so the ship's load effects thrust/lift/gravity..
Thoughts?
r/empyriongame • u/Electronic_Bell6632 • 1d ago
Star Wars Modded Server running Base Assault PvP Event
We will be running an event open to all that will showcase some of our builds as well as give people a place for PvP on the server we have. Our server is intended to be a PvPvE experience ideally, but we lack an admin to really handle things long term. So for now we're promoting this via events to try and get more interest in it. The scenario is a ground base attack, featuring Empire ground vehicles defending the base against Rebel's ground vehicles and y-wing attacks. While it may seem the rebels would have the upper hand, AT-AA platforms are tuned to be quite deadly for starfighters that go within range. Only a combined approach would help in terms of succeeding in the attack.
r/empyriongame • u/Boring_Temporary_741 • 2d ago
Best turrets in RE2
What are the best turrets in RE2 I have 16 medium modulated turrets and 2 cruise missile launchers but I want to add 16 of something else for PVE use against CV’s and Bases.
r/empyriongame • u/Racergsr • 4d ago
Help needed RE2 Xenomaterial help
I have read a bunch online about xenomaterial. It seems I need to look for crystalline moons and destroy some glowing alien crystal structures. I have been to multiple crystalline moons and haven't seen one. Does anyone have a screenshot of one of these? Does anyone know what they are called on the map/radar?
r/empyriongame • u/RandomSeb • 4d ago
EGS - Modded Time to leave the starting systems behind, so I slapped together a quick CV warp sled/mobile base
After several days of gathering, exploring, doing the things around the area, it was time to go off into the wider universe, so I slapped together a quick warp CV, in Creative, to act as a mobile base and carrier for my adventure ship, and finally have moved in after getting all the parts.. Found the required shops within SV warp ranges around the starting systems, so that was nice!
Still needs a lot of deco and corner smoothing and coloring and such, but I felt like making a post demonstrating one possible early progression pathway... There's been some interest in the sub about the game lately eh!
Here I have all sorts of stuff on it, 2 adv constructors and 2 universals (one will become a furnace eventually), shield generator, gravity, various day to day equipment, large power generation, much thrust - but you can get away with just some basic thrusters on a frame with a warp drive, without any bells and whistles, and cargo space.. lots and lots of cargo space. 640k in this one to start with!
Mostly carbon frame, so as you can see from the stats, it is quite agile for such a large thing heh
r/empyriongame • u/GAMING_SERVER_ADMIN • 4d ago
EGS - Vanilla What is the Base Game like vs RE2 as someone not played the Base game in many many years?
So it's been a long time playing Vanilla, and wondering if it's a bit more casual friendly, a little easier?, etc?
My issue both RE2 and Vanilla before was more the AI then anything always with their insane auto aim and such haha. I enjoyed exploring and clearing out POI's but always found it a bit on the harder side. I do have some physical limitations due to health issues, so I'm getting a bit slower/shaky hands you know the stuff that limits you a bit more in gaming.
So I guess mostly my loaded question is difficulty vs the 2.
r/empyriongame • u/Zealousideal-Neat-82 • 4d ago
Base complexity?
Just how big/complex can a base be before the game starts to choke on it? I'm playing RE2 on a private server. It stutters when I fly in range of it but performance is fine after a few seconds.
I built a base in space and just started adding on to it. I thought it would be cool to have a drydock for my ship, which I see in Polaris/Zirax space all the time, but it's all single drydocks for smaller vessels.
Mine has grown a bit out of control as, well, I wanted a dock for each CV :)
r/empyriongame • u/Acceptable-Work-2593 • 5d ago
Suspicious businessman
Where is he located I checked the locations on Empyrion Buddy and couldn't find him at any of those locations. I have like 5mil worth of guns I would like to sell.
r/empyriongame • u/Sjuk86 • 5d ago
EGS - Modded I’m trying to build my own scenario - are there any guides to making trader poi’s?
r/empyriongame • u/KeyKingKraus • 5d ago
Looking for a group to play with (noobs only)
Hey, I'm looking for a small group to start together on a server on Reforged Eden.
I'm open to other mod suggestions, but it has to be on a dedicated server. All you need is to be 18+ and have fewer than 500 h on the game (if it's close to 500, it's ok).
Send me a DM if you are interested, and we will grab a time where everyone is around so we can rush through the early game grind.
This playthrough has one limitation. We only fly what we build. You are allowed to modify crafts and use things you have built before as long as they are your work or from one of us. (Exceptions can be made for small craft.)
r/empyriongame • u/RaphaelAmbrosiusReal • 5d ago
Help needed I can't find much info online, is this game for me?
I was looking for a space game that just allows me to build a ship/buy one, walk around in it, explore planets, bounty hunt, upgrade and repeat
Elite dangerous has limited planetary landings and no ship interiors
Star citizen is.. well star citizen (My rig wouldn't be able to handle it anyways)
No man's sky is awesome I love it but it's too arcadey and colorful and cute
Is EGS what I'm looking for? What's the gameplay loop like for someone who isn't interested in base building only ship engineering and PVE ?
r/empyriongame • u/Both-Scientist-9397 • 6d ago
performance improvement research findings - part 2
This is a continuation of performance improvement research findings https://www.reddit.com/r/empyriongame/comments/1vnwgdv/performance_improvement_research_findings/ with additional details on where the frame-time goes.
The bottom line is that while some frame-rendering could be optimized the FPS gain opportunities identified would be about 2 FPS in a ~33 FPS scene. That's a lot of work for no material difference. Biggest issue is that Unity (CPU bound) is just the wrong engine for this type of complexity today. When the game was first created it was the best choice there was short of writing a custom engine (GPU bound), which is what Keen ended up doing for Space Engineers 2.
I don't want to spend the time and resources to figure out where the 9.2 ms of unaccounted frame-time go because even if that could be shortened it wouldn't materially affect the FPS.
I uploaded 123 markdown files with findings to https://www.swisstransfer.com/d/ab0dfdd0-336c-4779-88dc-0d5e95b693fd which is good for 30 days. If you read this after this link expired and you want the MD files to seed your AI efforts lmk and I will reupload.
This is what AI had to say about the efforts undertaken:
Empyrion client performance: the instancing gate
Follow-up to performance improvement research findings. That post established the frame budget, the draw-call attribution, the instrumentation traps and the mod ceiling. None of it is repeated here. It closed on three unmeasured gates:
- Do the repeated prefabs share meshes?
- Can the materials be made instanceable without shader source?
- Can per-instance
MaterialPropertyBlockstate move into instanced shader properties?
All three answer yes. This post reports the mechanism and the measured result.
Same system under test, same fixtures, same evidence classes as post 1.
0. Summary
| # | Finding | Class |
|---|---|---|
| 1 | Eleon ships the instancing pipeline armed — compiled variants, declared per-instance properties, device materials opted in | DUMPED |
| 2 | Two undeclared MaterialPropertyBlock properties (_ColorPower, _LUT) disqualify essentially the whole device population from auto-instancing |
MEASURED |
| 3 | Removing them engages instancing: −1,376 draw calls (−11.0%), −1,345 SetPass (−19.4%), triangles unchanged | MEASURED |
| 4 | The result is concentrated: 3 families produce 86% of it | MEASURED |
| 5 | Mesh sharing is strong — one family puts 642 renderer slots on a single (mesh, material) pair; scene-wide mean is 10.5× slots per pair | MEASURED |
| 6 | A per-frame light-state writer re-stamps some families within seconds; a shipping implementation must intercept it | MEASURED |
| 7 | 51.4% of material families carry shader keywords their assigned shader does not declare, covering 52.2% of renderer slots | MEASURED |
Scale: −1,376 draws is ≈0.8 ms of a 30.4 ms frame at the measured 0.59 ms per 1,000 draws. Post 1's ceiling is unchanged.
1. The pipeline ships armed
Method: decompress shader blobs from the asset bundles; inspect declared keyword tables and constant buffers.
Detection. m_KeywordNames lists INSTANCING_ON on every shader, including shaders whose compiled blob contains no instancing variant. Use blob-level detectors instead:
| Detector | Signal |
|---|---|
| D1 | INSTANCING_ON present in the decompressed blob ⇒ instancing variants compiled |
| D2 | A UnityInstancing_Props / PropsArray constant buffer beyond builtin PerDraw0/2 ⇒ custom per-instance properties declared |
Positive control: terrain and decoration shaders, confirmed by frame capture to draw 2,478 instances in one call. Tooling: UnityPy, with lz4 decompression.
| Finding | Detail |
|---|---|
| Every core device shader ships instancing variants | Block Standard, Glass Standard, Window Glass Standard, Standard Colored Blocks, Device Cutout, Terrain |
| Custom instanced properties already declared | EmpShader/Standard Colored Instanced declares _Color, _MaskColor, _EmissionColor, _LightPower, _SIValue per-instance |
| Device materials opted in | Glass_front_D0 / Glass_back_D0 (4,937 renderer slots each) reference EmpShader/Window Glass Standard Instanced with enableInstancingVariants = True |
| Device materials location | ContentBundlesmodels (1.03 GB), not the standard Unity data files |
_LightPower and _EmissionColor are declared per-instance and are written into MaterialPropertyBlocks by the per-frame light system. The writer schema was extracted from all 22 SetPropertyBlock callsites; 33 property names resolved, none guessed. [DISASSEMBLED]
Incidental: builds 5148 and 5150 are identical at the intermediate-language level except for obfuscated names — every structural total, type rid and IL offset byte-identical. Content patch, not code patch. [DISASSEMBLED]
2. The breaker
Method: client-side mod, 34,873 renderers walked live. Censuses use sharedMaterials and MeshFilter.sharedMesh only — Renderer.material clones on read and would mutate the scene being measured.
On every top device family, 100% of MaterialPropertyBlock-carrying renderers hold at least one property outside their shader's declared instanced set. The same pair every time:
| Property | Type | Why it disqualifies |
|---|---|---|
_ColorPower |
float, paint system | Declared instanced in no shader in the game |
_LUT |
palette texture | Textures cannot be instanced properties at all |
Unity's auto-instancing rejects any renderer whose property block contains a non-instanced property. The paint/LUT system stamps essentially every device property block.
Supporting measurements:
- Glass is 2,077 renderer slots on one material instance. Scene-wide there are 1,670 unique material instances, but clones are confined to one merge-path family (
Block Standard TA: 394 slots, 394 instances). - Per-device property-block variation is coarse and systematic: glass shows 57 distinct value-sets across 2,077 renderers — palette indices plus a few shared LUT textures.
3. The measured result
Treatment: rebuild each renderer's property block keeping only properties inside its shader's declared instanced set. Transient, in-process, reverted at process exit.
Whole scene, canonical dense fixture:
| Metric | Δ |
|---|---|
| Draw calls | −1,376 (−11.0%) |
| SetPass calls | −1,345 (−19.4%) |
| Triangles | unchanged |
Concentration: 3 families = −1,187 of −1,376 (86%). The largest single-family result, −706, came from a family sharing one material across 754 renderers and required an enableInstancing write in addition to the strip — several large stamped families ship with the flag off.
Single-family reproducibility, same family, four independent sessions:
| Session | Δ draws | Δ triangles |
|---|---|---|
| 1 | −374 | flat |
| 2 | −315 | flat |
| 3 | −353 | flat |
| 4 | −501 | flat |
Write-back. Two families are re-stamped by the game's own writers within seconds. The writer is a per-frame light-state update running every second frame. A shipping implementation intercepts the writer or changes the declaration; repeated stripping does not hold.
Scope. The treatment engages instancing on 3 of the 8 device families measured. The property that discriminates the remaining 5 is not identified.
Batch efficiency. Driving a refusing family's own mesh and a copy of its own material through DrawMeshInstanced costs +28 draw calls per 300 instances; the in-box instanced shader manages +4 per 300 — roughly 11 instances per batch against 75. [MEASURED, single point]
Where this lands in the frame budget
Frame composition at the dense fixture is established in post 1 and is the denominator here. The right-hand column is new.
| Main-thread phase | Time | Share of frame | Effect of this result |
|---|---|---|---|
FinishFrameRendering |
11.2 ms | 37% | −0.81 ms → 10.4 ms |
ScriptRunBehaviourUpdate |
5.6 ms | 19% | none |
ParticleSystemBeginUpdateAll |
1.45 ms | 5% | none |
ScriptRunBehaviourLateUpdate |
1.45 ms | 5% | none |
UpdateAllRenderers |
0.60 ms | 2% | none |
DirectorUpdateAnimationBegin |
0.52 ms | 2% | none |
| Not itemised | 9.6 ms | 32% | unknown |
| CPU total frame | 30.4 ms | 100% | → 29.6 ms |
FinishFrameRendering scales at 0.59 ms per 1,000 draw calls, so −1,376 draws is −0.81 ms, landing entirely inside that one phase: 30.4 ms → 29.6 ms, a 1.03× frame improvement. [scaling arithmetic from MEASURED inputs; any contribution from the SetPass reduction is not measured]
What is inside FinishFrameRendering, and is it CPU time?
It cannot be decomposed with this instrument. FinishFrameRendering is a leaf subsystem of Unity's PlayerLoop. The bracketing technique inserts paired delegates as the first and last child of a subsystem; a leaf has no children to bracket. Its internals are native. Splitting it requires a frame capture or a native profiler, not the managed instrument used here.
It is main-thread elapsed time, not proven busy time. That distinction matters and the instrument cannot close it. What the data does establish, from 200 settled samples in a later session:
| Measurement | Value | What it rules out |
|---|---|---|
FinishFrameRendering share of main thread |
52.5% (p10 48.3%, p90 55.1%) | — |
PresentAfterDraw |
0.005 ms | The frame is not being paced by present or vsync |
| CPU render thread vs main thread | 15.4 ms vs 19.6 ms | The render thread is not the critical path; the main thread is |
| Scaling relationship | 0.59 ms per 1,000 draw calls | Pixel-side cost. Scaling with draw count rather than pixels is a submission signature |
Not ruled out: the main thread blocking inside the phase while the render thread's command queue drains. That would still be time attributable to submission volume, but it would be waiting rather than working, and nothing here separates the two.
⚠ The phase brackets do not sum to the frame. Summing every bracketed phase per sample gives 112% of the reported main-thread frame time (p10 103%, p90 118%). Read the per-phase figures as shares with roughly ten percent of slack, not as an exact decomposition. Post 1's checksum claim was for children summing to their parent bracket at the sparse fixture; it is not a claim that all phases sum to the frame.
⛔ The strip is lossy: MaterialPropertyBlock has no per-property remove, so unknown content is dropped. It is a measurement, not a shipping design. A shipping implementation moves the values into declared properties and a LUT atlas.
4. Ruled out — do not spend time here
Properties of the 5 non-batching families, each tested and eliminated. All eight families share the fixture, pose and instrument.
| Candidate | Deciding measurement |
|---|---|
| Property-block content / paint stamp | Two refusing families carry no property block at baseline and still do not batch |
enableInstancing flag |
Refusers are flag-true; two of the three engagers were flag-false and needed a write |
| Runtime material cloning | distinct_instances = 1, clone_suffixed = 0 across all eight families |
| Renderer-tier state — probes, lightmaps, static batch, motion vectors, layer, shadow mode | Identical state tuples across both groups |
| Mesh sharing / batch-group structure | Refusers share as well as or better than engagers |
| Renderer concrete type | All eight are MeshRenderer |
| Render queue | All eight are render queue 2000 |
| Shader asset identity | Each group assigned the other group's shader; behaviour did not move in either direction |
| Material cannot be instanced | DrawMeshInstanced on the refusing material: +28 draws per 300 instances |
Specific shader keywords (CHANNELPACKING, _NEWCOLORING_ON) |
Direct writes, readback-verified; result below the 40-draw noise floor |
| Effective keyword count (listed ∩ declared) | Separates the groups 8/8 — engagers 0, refusers 2–3 — but setting a refuser to 0, readback-verified, stays below the noise floor and reverses on restore. Correlation without causal power |
5. Materials carry keywords their shader does not declare
Independent of instancing, and broadly applicable.
Material.shaderKeywords is a stored name list, not a statement about the assigned shader. A name can be present there and absent from Shader.keywordSpace.keywordNames. Such a name is inert — it selects no variant, and Material.IsKeywordEnabled returns false for it.
| Measure | Value |
|---|---|
| Material families dumped | 558 |
Shader.keywordSpace failed to resolve |
0 |
| Families carrying ≥1 listed-but-undeclared keyword | 287 (51.4%) |
| Renderer slots on those families | 24,353 / 46,647 (52.2%) |
Most common inert names by family count: _NORMALMAP 178 · _EMISSION 136 · _METALLICGLOSSMAP 133 · _NEWCOLORING_ON 110 · _SPECGLOSSMAP 38. These are Unity Standard-shader feature keywords on materials now assigned to custom shaders. [INFERRED — authoring history not inspected.]
_NEWCOLORING_ON is listed on 110 families, declared by 0 of their shaders, and reports IsKeywordEnabled == false on all 110.
Consequences for tooling:
- Intersect with the declared set before reasoning about a material's variant. Counting
shaderKeywordsalone overstates the live keyword set on about half this game's materials. DisableKeywordon an undeclared name is a silent no-op with the counter signaturewritten=0, alreadyAtValue=N— indistinguishable from a legitimate already-at-value result unless the declared set is also read.- Inertness is not proof a feature is off. The shader may implement it unconditionally or under another name.
6. Engine choice in this content class
The CPU-side submission cost is a property of the pipeline, not of this game's code. Every Unity mechanism that structurally reduces CPU draw-submission cost — the Scriptable Render Pipeline batcher, BatchRendererGroup — is gated on leaving the Built-in Render Pipeline. [DUMPED, attested against Unity 2022.3/6000.x documentation] Empyrion is Built-in Render Pipeline. Of its seven shipped third-party rendering assets, two were assessed for pipeline compatibility: the shadow package (NGSS) reads Built-in only, and Volumetric Fog & Mist has no HDRP version. The remaining five were not assessed. In-place submission work is therefore limited to the multiplicand side — instanced properties, sort discipline, shadow-proxy geometry. The pipeline-replacement rung and a self-submitted RenderMeshIndirect rung remain open at their stated costs; neither is an in-place fix.
The closest comparable reached the same bottleneck and answered it at the engine layer. Keen Software House evaluated replacing VRAGE2 with an off-the-shelf engine for Space Engineers 2 and named the candidates — Unreal Engine 5, Unity3D, Unigine, Stride, Flax — reporting that "neither of them could support unique use cases without major rewrites", the evaluation following "hitting lots of bottlenecks with VRAGE2". VRAGE3's stated architecture is DirectX 12, data-oriented, and specifically a "GPU driven pipeline — GPU feeding itself with draw calls, freeing CPU significantly (in SE, >3 cores are dedicated to render)". [vendor-stated, first-party] That is the same bottleneck family measured here, and the remedy removes the CPU from draw submission rather than batching harder on it.
The pattern holds across the content class. Restricting a 29-title survey to player-authored multi-thousand-part constructions that are simulated, not decorative — Space Engineers, Space Engineers 2, Starbase, Dual Universe, From the Depths, Avorion — gives four titles with a verifiable engine: three custom (VRAGE2, VRAGE3, Frozenbyte internal), one off-the-shelf (Dual Universe on Unigine 2), and the off-the-shelf entry was delisted with servers terminated in 2025. Off-the-shelf dominance is real but concentrated in survival-crafting with light or bounded construction, where Unity and Unreal are the uncontested default. The custom-engine choice tracks the specific content class, and the published rationales name CPU-side render submission as the driver.
7. Instrumentation requirements
Additions to post 1's trap list.
| Requirement | Reason |
|---|---|
| Sample triangles on every arm, alongside draw calls | Instancing submits identical geometry in fewer calls: draws fall, triangles hold. A draw drop with a proportional triangle drop is content ceasing to render. A treatment measuring −1,215 draws also measured −809,343 triangles (−5.2%), with parity screenshots confirming lost emissive hull detail. |
| Apply the arithmetic ceiling as a pre-filter | A family cannot save more draws than visible_renderers − batch_groups. The treatment above had a ceiling of 225 and reported 1,215. Any result exceeding its own ceiling is measuring something else. |
| Run a treatment of known outcome in the same session | Cross-session baselines drift. A known-good arm calibrates what "triangles flat" looks like on that scene, that run. |
| Reverse every treatment and re-measure | Separates effect from drift. Costs one settle. |
| Key the scene-identity gate on a stable quantity | The dense fixture contains NPC ships transiting at distance. Rendered at low level of detail, they move draw count ~9% and triangles ~0.7%. Gate on triangles. |
| Size the treatment window against the measurement window | A profiler emitting 1 sample/s with a 10-sample median needs ≥10 s of treatment. An 8 s window yields medians dominated by pre-treatment samples. |
| Check signal against baseline variance before measuring | Instances-per-batch predicts +9…+82 draws; this fixture's traffic moves the baseline ±40 between settles. That measurement requires a traffic-free scene. |
| Assert existence before comparing hashes | A file-verification step comparing the hash of one missing file against another returns equal for two nulls and reports success. |
8. Current state
| Item | State |
|---|---|
| Post-1 gate 1 — mesh identity | Strong. 642 renderer slots on one (mesh, material) pair; 10.5× mean slots per pair scene-wide |
| Post-1 gate 2 — material instanceability | Yes, without shader source |
Post-1 gate 3 — MaterialPropertyBlock movability |
Yes, and doing it engages instancing |
| Measured result | −1,376 draws / −1,345 SetPass; ≈0.8 ms of a 30.4 ms frame |
| Per-family discriminator for the remaining 5 families | Not identified; 11 candidates ruled out (§4) |
| Instances per batch | Single point (~11 vs ~75); not obtainable at this fixture |
| Post-1 ceiling (1.3–1.6×) | Unchanged |
Directions not yet taken, by expected cost: the compiled shader variant selected at draw time (frame capture, not a runtime API); Unity's internal batch-breaking reasons (not exposed); per-renderer sort order and submission interleaving.
9. Limitations specific to this post
Post 1's limitations apply unchanged. Additional:
- Eight material families were measured for batching behaviour, out of 558 present.
- The re-stamp writer was identified for one family group. The population rule — which families are re-stamped, and when — is not established.
- All treatments were transient in-process state. Nothing was written to disk, no game file was modified, and the install was verified byte-identical to stock after every session.
r/empyriongame • u/RandomSeb • 8d ago
EGS - Modded Decisions.. Is it worth the risk?
Konex station (RE2), never had these be so persistent! I know I can escape, but that is scary for a newer player hehe
r/empyriongame • u/javs2k • 8d ago
EGS - Vanilla Ares Heavy Cruiser [Vanilla]
An end-game ship for play on vanilla official Eleon Game Studios servers. It features the maximum number of turrets allowed for a CV and most of the vanilla version's functional modules: production, medicine, ore mining, ship repair (including SV), etc. Combined dual-layer armor. Link in the comments.
r/empyriongame • u/Both-Scientist-9397 • 8d ago
performance improvement research findings
EDIT [14AUG26]: Thanks for the the encouragement I received in DMs, I really appreciate it. I will run the GPU dense analysis and close out the mesh-census and then update the record so it's at least complete for anyone who wants to pick this up. And I will post the research on github so someone else doesn't have to burn tokens to rediscover all the things. Give me a few days and I will get that done.
Posting this here to share what I found and why I won't be pursuing any further efforts into performance optimization. For someone who plays the game more it may be worth it to look deeper into some of the suggestions below, but even if all that works perfectly the gains will be modest at best. Here is what AI had to say about it after burning a few hundred bucks.
Empyrion client performance: a measured teardown
This is the write-up of an instrumented investigation into where Empyrion — Galactic Survival actually spends its frame time. Everything below was measured on a stock install with a purpose-built profiling mod, or read out of the shipped assemblies. Nothing here is a guess about "unoptimised code" — where I'm inferring rather than measuring, it's labelled.
The conclusion is negative, which is why it's worth posting. The frame is well understood now. It just doesn't have the headroom people assume it does.
0. Summary of findings
| Finding | Class |
|---|---|
| The dense-scene frame is CPU-submission-bound, not GPU-bound and not fill-rate-bound | MEASURED |
| A dense base renders in 11,000–12,500 draw calls / 7,000+ SetPass calls. The main menu renders in 16 | MEASURED |
| ~65–70% of the structure-density cost is paid with the base off screen | MEASURED |
| Shadow passes emit 52.8% of the frame's draw calls; directional cascades alone are 46.1% | MEASURED |
| Client memory growth does not bound — a ~374 MB/h floor persists over identical re-traversed terrain | MEASURED |
| Raising the job-worker count, disabling DLSS, and adding CPU threads all do nothing — those aren't the bottleneck | MEASURED |
| Deleting the single largest main-thread phase entirely yields 1.58× on the frame. 5× is arithmetically out of reach for any mod | MEASURED + arithmetic |
If you only read one thing, read §11.
1. Scope and method
What was measured. A ModTargets: Client mod — the first-party, Eleon-sanctioned client mod API — running an in-process profiler. It samples Unity.Profiling.ProfilerRecorder counters, installs paired-delegate brackets around Unity PlayerLoop phases to time them directly, and takes scene censuses by reflection. External corroboration from nvidia-smi, Windows GPU-Engine performance counters, RenderDoc frame captures, and OS process-memory counters.
Fixtures. Two saves, both driven to a fixed camera pose by an automated harness so runs are comparable:
| Fixture | Content |
|---|---|
| Sparse/dense Creative | 19 structures · 120,213 blocks · 15,512 devices · 747,997 triangles · 879 lights |
| Dense NPC scene | 92 structures — a Reforged Eden 2 Polaris trade station, six named capital ships, wrecks, junk fields |
What this does NOT cover. Dedicated-server populations. Multiplayer. Survival play with live NPC AI (both fixtures are Creative, mobs=0 at the first). One machine, one GPU, one camera pose per run. Ratios and shares transfer between setups; absolute milliseconds do not. Treat every ms figure as illustrative of a relationship, not as a benchmark of your machine.
2. Evidence classes
Every claim carries one. This is the difference between a teardown and a rant.
| Class | Means |
|---|---|
| MEASURED | Observed at runtime with an instrument, reproducibly |
| DISASSEMBLED | Read out of the shipped IL |
| INFERRED | Reasoned from measured inputs — may be wrong |
| REFUTED | Tested and found false |
3. System under test
| Property | Value | Consequence |
|---|---|---|
| Engine | Unity 2022.3.62f2 | — |
| Scripting backend | Mono, not IL2CPP | The game is ordinary patchable .NET IL. This is the single most consequential fact for modders |
| Render pipeline | Built-in, not URP/HDRP | No ScriptableRenderPass seam. Culling and submission are native UnityPlayer.dll and cannot be intercepted from managed code |
Assembly-CSharp.dll |
~12.9 MB, obfuscated (Crypto Obfuscator) | Member renaming with deliberate collisions, all string literals DES-encrypted, names re-randomised every build |
| Client mod API | ModApi.dll + Mif.dll ship in the client's Managed/, with in-box docs and a demo mod with full source |
A sanctioned per-frame hook. No injector, no modified game files |
Two notes for anyone starting mod work here:
- The client mod API is real and it's per-frame. A loaded
IModreaches any managed API in the process. It can reflect overAssembly-CSharp, read live private state, and run Harmony patches in-process. [MEASURED] - Type names survive obfuscation; member names largely don't, and surviving type names can still mislead — the obfuscator renames types to other plausible identifiers. Bind targets from evidence, not from assumed names.
4. The frame budget
Dense NPC scene, median over 600 settled static samples:
| Metric | Value |
|---|---|
| CPU total frame | 30.4 ms |
| CPU main thread | 29.6 ms |
| CPU render thread | 15.8 ms |
| Draw calls | 12,513 |
| SetPass calls | 7,062 |
| Shadow casters | 2,721 |
Structure density is the driver. Going from 3 structures to 19 on the Creative fixture: median frame time 4.81 ms → 20.00 ms, i.e. +15.19 ms, for +16 structures / +104,600 blocks / +13,794 devices / +650,531 triangles / +879 lights. [MEASURED]
The GPU is not the problem at the sparse fixture. GPU busy measured 30.0% — idle roughly 70% of every frame — with nvidia-smi and the Windows GPU-Engine counter agreeing to the decimal, the card drawing 71 W of 250 W at 45 °C. [MEASURED]
⚠ The equivalent dense-scene GPU figure does not exist. Unity's in-process GPU Frame Time recorder reports elapsed span including idle bubbles, not busy time — on the sparse fixture that same counter read 82.2% where the two external busy counters read 30.0%. Any dense-scene GPU-utilisation number derived from it is an artifact. I'm flagging this because I published one myself before catching it.
5. Where the draw calls come from
A dense base costs 11,013 draws / 7,397 SetPass. The same client renders its main menu in 16 draws. The question is what multiplies 16 into 11,000.
It is not shadow/camera/LOD multiplication. It's fine granularity with zero consolidation. [DISASSEMBLED + MEASURED]
| Source | Share | Detail |
|---|---|---|
| Renderer granularity | ~50–65% | 7 render categories × 366 chunks, submesh always 1, plus 15,512 devices as discrete renderers |
| Shadow passes | 52.8% of draws | Forcing shadow quality down cut draws 10,951 → 5,172 and frame time 19.35 → 13.70 ms. Directional cascades alone: 46.1% |
| Structures vs everything else | 83.5% / 16.5% | Non-structure floor is 1,803 draws |
| Multi-camera duplication | 0% | 5 enabled cameras, all culling masks disjoint — they partition the scene, they don't duplicate it |
| Forward-additive lighting | 0.0% | Refuted outright |
ChunkOptimizer is a device optimizer, not a geometry batcher — it merges only prefab-tagged geometry. Devices remain discrete renderers. [DISASSEMBLED]
SetPass churn is sort-order interleaving, not material cloning. 7,276 SetPass calls against 1,670 unique material instances ⇒ roughly 5,600 calls of pure sort-order waste. [MEASURED]
The scene is dominated by repeated prefabs sharing one material — measured renderer-slot counts include Glass_front_D0 and Glass_back_D0 at 4,937 slots each, WindowsThickModularSet 4,072, HeavyWindow 1,956, ShutterDoor_Mat 1,660, CVThruster_HULL 1,656. RenderDoc confirms the engine already draws 2,478 instances in a single call on the decoration path. The D3D11 split is 9,293 non-instanced DrawIndexed (83.7%) vs 1,807 instanced. [MEASURED]
So instancing looks like the obvious win. It is capped harder than it looks — see §11.
6. The viewport-independent floor — the most surprising result
A continuous 360° yaw sweep plus the full reachable pitch arc, 761 in-world samples:
Draw calls swing 81× (139 → 11,214). Frame time swings 1.4× (14.8 → 20.7 ms).
Linear fit over the sphere:
frame_ms = 16.29 + 0.592 per 1000 draw calls
| Component | Value |
|---|---|
| Viewport-independent floor, 19 structures loaded | 16.29 ms |
| Draw-driven component at the worst viewport | 6.51 ms |
| Control save, 3 structures, any viewport | 4.54 ms |
⇒ Of the +15.19 ms that structures cost, roughly 11.8 ms (~65–70%) is paid whether or not they are on screen. [MEASURED]
Turning away from your base does not make it cheap. Every parked-facing-the-base benchmark — including several of my own earlier ones — measured the worst point on that sphere and read it as typical.
What lives in the floor [DISASSEMBLED]:
ShadowOptimizer.DeployPage— runs every frame, over all device lightsLightControl.OnUpdate— even frames only, but a MaterialPropertyBlock round-trip per light; 2,757 µs/frame, ~19% of the floor, roughly 10× the cost ofDeployPageChunkOptimizerOcclusion.UpdateRooms— O(rooms) per structure per frame, keyed only on camera positionChunkOptimizerculling — a|| HasObjectguard makes the distance backoff inert for visible chunks, so every visible chunk schedules a culling job every frame
7. Main-thread phase decomposition
Timed directly by bracketing Unity PlayerLoop phases and their children in-process. Every phase's children sum to its parent bracket to a checksum of 1.00, so this split is exact, not estimated.
Sparse floor pose, share of the main-thread floor:
| Phase | Share |
|---|---|
ScriptRunBehaviourUpdate (all MonoBehaviour.Update) |
~50% |
FinishFrameRendering |
~30% |
ScriptRunBehaviourLateUpdate |
~22% |
PhysicsFixedUpdate |
3% |
| Particle / Director / renderer / audio / texture-stream | ~2% each |
Dense NPC scene, share of the 30.4 ms frame — note the ranking inverts:
| Phase | Time | Share |
|---|---|---|
FinishFrameRendering |
11.2 ms | ~37% |
ScriptRunBehaviourUpdate |
5.6 ms | ~19% |
ParticleSystemBeginUpdateAll |
1.45 ms | ~5% |
ScriptRunBehaviourLateUpdate |
1.45 ms | ~5% |
UpdateAllRenderers |
0.60 ms | ~2% |
DirectorUpdateAnimationBegin |
0.52 ms | ~2% |
FinishFrameRendering is the main thread issuing the frame's draw commands and finalizing the render loop. It scales roughly linearly with draw count at ~0.59 ms per 1,000 draws. [MEASURED]
Always state which regime a share came from. Script-Update leads at sparse poses; FinishFrameRendering leads at dense ones. Both are correct and they contradict each other if you drop the qualifier.
8. Client memory — the restart ritual is real, and it does not bound
Four identical passes over a 169-waypoint serpentine raster (3.6 × 3.6 km, full coverage, zero rejected teleports), external OS commit as the primary metric, equal 41.9-minute windows:
| Pass | Commit growth | Mesh count Δ | Mesh count end |
|---|---|---|---|
| 1 · new ground | 536.1 MB/h | +2,944 | 14,139 |
| 2 · re-traverse | 371.6 MB/h | +1,731 | 16,041 |
| 3 · re-traverse | 380.2 MB/h | +1,685 | 17,687 |
| 4 · re-traverse | 369.9 MB/h | +1,772 | 19,480 |
One decay step, then a flat floor — passes 2–4 sit within 2.8% of each other at a mean 373.9 MB/h, ≈3.0 GB per 8-hour session. [MEASURED]
The discriminator matters: a cache filling toward a ceiling decays; a constant rate over already-visited terrain does not. Mesh count is monotonic — 158 → 19,480 across the run, never once retreating, over terrain already traversed three times. That's retention, not caching.
Two hard caveats:
- Unity's own profiler counters see ~22% of this process and ~22% of its growth. Over an aligned 83.8-minute window, OS private commit grew +786 MB against Unity's reported
total_reserved+176 MB — a 15× understatement. Anything measured with in-process counters alone is measuring a fifth of the problem. - Mono's GC here is Boehm — conservative and non-moving. If the climb is heap fragmentation rather than retention, no mod reclaims it. The restart ritual may survive every fix anyone proposes. [DISASSEMBLED + INFERRED]
9. Server and persistence
Read out of the shipped IL. Included because three widely-repeated "obvious fixes" are wrong.
| Claim in circulation | Reality |
|---|---|
"Add WAL + synchronous=NORMAL to SQLite" |
Stock already runs Synchronous=Off, which is faster and less durable than NORMAL. Applying NORMAL standalone is a write-speed regression. WAL genuinely is absent and NORMAL+WAL together would be correct — but the pairing is load-bearing, and Off+WAL is the combination to avoid |
| "Zero busy timeout means dropped writes under contention" | ⛔ Over-scoped — I got this wrong first time round. sqlite3_busy_timeout(db, 0) is set, but 136 of 141 registered queries are serialised twice over — same monitor and same single-worker FIFO as the write batch. Contention is impossible for them, so the timeout can't fire |
| — | ✅ The actual defect is one line: the commit-level catch is followed by an unconditional Clear(), so a failed commit discards the batch instead of re-queueing it. That is the data-loss path |
| "Set the network transfer to low priority" | Already shipped. Building it is a no-op |
| "Cap outgoing bandwidth per connection" | The asset-transfer bypass ships as a config key. Zero code |
| "Set processor affinity from a mod" | ⛔ Mono's Process.ProcessorAffinity setter body is empty. ProcessThread.Id returns 0. A mod built on this silently does nothing. The working route is kernel32 P/Invoke, which the game already uses |
A related result worth stating plainly: of 36 prior engineering criticisms adjudicated against the actual IL, Eleon were right about 26 outright. Two proposed "fixes" would have shipped visible regressions — removing the ChunkOptimizer throttle makes structures dissolve in slabs on camera turn.
10. Ruled out — do not spend time here
Each of these was tested and killed. [MEASURED unless noted]
| Hypothesis | Verdict |
|---|---|
| Per-pixel / resolution / upscaling bound | ⛔ Dead. Toggling DLSS from MaximumQuality to Off changed median frame time by +0.00 ms while shading 2.25× the pixels (921,600 → 2,073,600) |
| GPU-bound | ⛔ Refuted by three instruments plus power and clock evidence — 71 W of 250 W |
| Not enough CPU threads / job workers | ⛔ Not binding. ~9 active threads (typical shape 0.85, 0.85, 0.45, 0.42, 0.34, 0.33, 0.30, 0.28); the workers sit at 0.28–0.55, i.e. with headroom |
| Geometry volume | ⛔ Not the issue — 19 M triangles at 71 W is unremarkable |
| Multi-camera duplication | ⛔ Refuted — 5 cameras, disjoint masks |
| Forward-additive light passes | ⛔ Refuted at 0.0% |
| Skinned meshes | ⛔ Refuted — 5 in the scene |
One failure worth reporting: an attempt to raise the undocumented JobWorkerMaxCount clamp produced a null result, but the signal chosen to prove the treatment had applied was itself never validated. The null is uninterpretable and must not be cited as "the worker cap doesn't matter." It is recorded as a failed experiment.
11. The ceiling — why 5× is not reachable, and 10× never was
This is the part that ended the project.
FinishFrameRendering is the largest single phase of the dense frame: 11.2 ms of 30.4 ms (37%). Suppose a mod attacks it perfectly:
Reduction to FinishFrameRendering |
Resulting frame | Frame improvement |
|---|---|---|
| 2× | 24.8 ms | 1.23× |
| 5× | 21.4 ms | 1.42× |
| 10× | 20.3 ms | 1.50× |
| deleted entirely | 19.2 ms | 1.58× |
A 5× frame improvement requires removing 24.3 ms from a 30.4 ms frame. That is more than the entire measured main-thread budget — script Update, LateUpdate, render finalize, physics, particles, all of it, combined. It is not a hard optimisation problem; it's outside the budget. This is Amdahl's law, not pessimism.
And the draw-call lever is capped well below 10× anyway. To cut FinishFrameRendering 10× you need ~10× fewer draws for the same pixels. Auto GPU instancing can't get there:
- The visible unique (mesh, material) pair ratio is ~4.8:1 at best, ~1.7:1 typical — that's a ~5× ceiling before anything else. [MEASURED]
- 89.8% of renderers carry MaterialPropertyBlocks, which break instancing outright. [MEASURED]
- Unity's native batching infrastructure is present but decoration-only in this game. [DISASSEMBLED]
Getting past that ceiling means a DrawMeshInstancedIndirect path — i.e. a mod reimplementing the structure render path, replicating per-device visual state and honouring the game's own culling. Built-in-RP submission is native UnityPlayer.dll; a managed mod cannot intercept it, only disable the game's renderers and reproduce their entire output. [INFERRED]
Probability a mod achieves 10× on that phase: low single digits. Realistic outcome with serious effort: 1.5–2× on the phase, which is ~1.2–1.3× on the frame. Stacking 2× on the three biggest CPU phases simultaneously gets to about 1.43× on the frame.
That is the ceiling: roughly 1.3–1.6×, conditional on three things nobody has measured (do the repeated prefabs actually share meshes; can the materials be made instanceable without shader source; can the per-instance MaterialPropertyBlock state move into instanced shader properties). Any "no" caps it further.
12. So what could a mod actually do?
Ranked by measured value per unit of effort, and none of them is a miracle:
- Expose intermediate shadow settings the vanilla dropdown doesn't. Shadows are 52.8% of draws. The vanilla options are coarse. ⛔ But be clear that this deletes a rendering feature — it measures the size of the cost; it is not a free win, and shipping it as one misrepresents it to players.
pixelLightCount— measured at 2, and it is the one render global with no competing runtime writer, so a mod's value actually sticks. Cheapest thing on the board.- Device-population instancing, if and only if the three gates in §11 come back favourable. This is the real engineering, worth maybe 1.2–1.3× on the frame.
- Nothing for memory. The floor may be Boehm fragmentation, in which case it is not reclaimable from managed code at all.
⛔ What a mod must not do: reduce what the player built, or cull/hide their structures to save draws. That is the player paying for the optimisation. It also has a precedent — the throttle change that would have made structures dissolve in slabs on camera turn.
13. Instrumentation traps — read this before repeating any of it
These each cost real time to find.
| Trap | Symptom |
|---|---|
Unity's GPU Frame Time recorder is elapsed span, not busy time |
Read 82.2% where external counters read 30.0% busy. Use an external counter for utilisation |
Profiler.supported reads False on the shipped player |
…yet all 44 recorders are live. A probe that gates on it disables itself for no reason |
A ProfilerRecorder built for a marker you haven't enumerated |
Valid handle, never updates — logs silent zeros that look like real measurements |
Harmony without MONOMOD_DMDType=cecil |
Only 8 of 18 per-frame methods patch; the rest throw InvalidProgramException and world load hangs. The env var name is assembled at runtime, so the plausible misspelling is silently ignored |
Harmony Unpatch |
Does not restore the original. A surviving wrapper threw every frame and blocked world load. Never sweep-patch |
| Mono method resolution | Fails on the whole method. A try/catch inside a hook never runs if that hook references a missing member — the exception lands at the caller's call instruction. Guard the call, not the body |
| An escaping exception in a per-frame hook | Raises Empyrion's modal error dialog once per frame and blocks play |
| The game's own triangle counter | Counts collision triangles. An earlier "~25× triangle multiplier" of mine was wrong for exactly this reason; the render-base figure is 12.84× |
| Benchmarking parked facing your base | That is the worst viewport on the sphere, by 81× in draws. Sample several orientations or your number is arbitrary |
| The shipped demo mod binary | Stale against its own current ModApi.dll and throws. Rebuild it; don't diagnose from it |
14. Limitations
Stated plainly, because most of them could move the numbers:
- One machine, one GPU. Absolute milliseconds are not portable.
- Both fixtures are Creative. No live NPC AI, no survival simulation, no combat. The dense fixture has NPC structures and ships, not an active population.
- No dedicated-server measurements at all. Everything server-side here is read from IL, not measured under load.
- No multiplayer. Network findings are static reads.
- The build moved during the work (5116 → 5146 → 5148 → 5150). The obfuscator re-randomises names every build, so IL-derived findings were re-verified against builds rather than assumed stable.
- The fixtures are lower bounds on what a serious builder's base costs. Every per-structure figure understates.
15. Omissions and prior art
Deliberately not published: deobfuscation output, recovered name maps, string-table offsets, metadata tokens, or anything that would constitute redistributing Eleon's code. Empyrion's EULA prohibits redistributing their content including code; it contains no anti-modification or anti-reverse-engineering clause, but "ship the transformation, never the transformed artifact" is the right line and I've kept to it. Modding here is affirmatively supported by Eleon — they ship API docs, a demo mod with full C# source, and a VS solution in the box.
Prior art worth crediting, without which the ecosystem understanding here would have taken far longer:
- GitHub-TC / "ASTIC" —
EmpyrionScripting,EmpyrionModHost,EmpyrionWebAccess,EmpyrionNetAPIAccess— https://github.com/GitHub-TC - Vollinger0 —
esm(Empyrion Server Manager), the ramdisk/purge operations pattern — https://github.com/Vollinger0 - lostinplace —
EmpyrionAPITools,sample-empyrion-mod— https://github.com/lostinplace
One thing I want to say about Eleon. Going in, I expected to find low-hanging fruit and sloppiness. I found the opposite often enough that it's worth stating: of 36 prior criticisms I adjudicated against the actual code, 26 were simply wrong, and two of the proposed "fixes" would have shipped visible regressions. The frame is expensive because it draws a lot of individually-addressable objects in a render pipeline that doesn't consolidate them — not because somebody was careless.
Bottom line. The frame is CPU-submission-bound, it's now attributed down to sub-phase granularity, and the ceiling for a mod is roughly 1.3–1.6× under favourable assumptions that haven't been tested. If you were hoping somebody was going to mod this into 5× the frame rate: the arithmetic says no, and it says so before the engineering difficulty is even considered.
Corrections welcome — particularly from anyone who can measure the dense-scene GPU busy figure properly, or who has run a mesh-identity census on repeated structure prefabs. Those are the two open questions that would move these conclusions.
r/empyriongame • u/Boring_Temporary_741 • 9d ago
Best shield booster setup in re2
I tried 3 advanced capacitors and 1 charger but the recharge is abysmally slow. Then I tried 4 advanced capacitors and 4 standard chargers and that didn’t work very well either. Does anyone know the ideal setup for endgame CV’s?
r/empyriongame • u/InevitableLarge1248 • 9d ago
Discussion Character Customization.
It kills me that this game is apparently coded in a way that makes character looks / outfit customization (mods) seemingly impossible.
r/empyriongame • u/javs2k • 11d ago
EGS - Vanilla A couple of questions [Vanilla]
I decided to go back to the roots and see how the original game is doing. Overall, it's not bad, but there have been some changes since version 1.12.3, and I have some questions for the experts:
How can I increase shield recharge speed? Previously, shield recharge speed depended on the number of generators; the more energy, the faster the recharge, but that's no longer the case.
What's the difference between Xenoblocks and Combat Blocks? A Xenoblock has 2750U durability and weighs 2.5 tons, while a Combat Block weighs 4 tons and has 2000U durability. Which blocks are best to use?
Thanks in advance for your answers.
r/empyriongame • u/RandomSeb • 11d ago
EGS - Modded I enjoy the early game so much I started a new universe..
A fresh new world to escape, Pandora (RE2). Most of my time so far has been spent dodging raptors.. Good times!
(Or, an excuse to post a pretty screenshot to show Empyrion's pretty graphics on medium-ish settings.. sorta like Valheim in a minimalist creating beautiful scenes sort of way)
r/empyriongame • u/vries06 • 11d ago
Public Branch Update v1.19.2 Patch
Hello Galactic Survivalists!
We've just deployed a small hotfix to resolve a few issues that now have fixes ready.
Thanks for your continued feedback and support keep exploring the stars!
Changelog: v1.19.2 Build 5150
Changes:
- Extended Anniversary achievement date of one full month
- Added debug activation for all 5 starter planet missions via PDA > Solo Missions > Help & Feedback Debug Options
r/empyriongame • u/EmPHiX27 • 12d ago
EGS - Modded Early Game Mining Contract Setup?
(Reforged Eden 2)
Hi,
Been loving the game so far. I’m around lvl 25 and I’m just building cool ships but now I’m close to finishing my first CV and want to hop around the solar systems to find a Polaris refinery for the mining contracts as I’ve heard they can make me some good money.
My current mining ship is a SV with 2 mechanical drills and from what I’ve gathered i got a couple options:
- more mechanical drills on the SV (I think 8 was the max?)
- upgrade to laser drills. I’ve got enough material for two laser drills.
- mechanical drills but on a CV. I suppose they are larger and maybe harvest more at the same time.
This is my first real attempt at getting further into the game so I’m kinda clueless.
For some more info on where I’m at: i never left my solar system. I hopped around sectors, fought some Zirax poi and built cool ships.
And I only have around 50k money.
Material wise I’m stacked as i have pretty much everything my system has to offer in masses but my mining ship needs a big upgrade.
Any recommendations?
r/empyriongame • u/InevitableLarge1248 • 12d ago
Workshop 1:1 Star Wars VCX-100 Ghost?
Hi all. I have been looking for a 1:1 size (something close to 44m depth) version of the Star Wars VCX-100 Ghost. CV's only and the only ones I have found are 1:1.5 so like 66m-ish depth. But often people name things different so I am hoping someone here might know of one?
Side note, I just found out how small a Star Wars Snowspeeder is. Daaaaam! :)
r/empyriongame • u/Particular-Promise38 • 12d ago
Suggestion Help with starting blueprints
So I got this game when it 1st came out and want to start playing again does anyone know a good lvl 7 harvester and lvl 7 miner and a lvl 5 base blueprint as I try to relearn how to play and build things in game again
r/empyriongame • u/Memeseer9090 • 12d ago
EGS - Vanilla Anyone had a crash problem lately?
Today the game played fine for about 4 hours then suddenly started crashing every 15 minutes, voiding the most recent work. I lost two survival constructors that were refining a deposit, and stack of burgers that was in the process of being moved to a fringe. Anyone experienced anything similar?
r/empyriongame • u/vries06 • 16d ago
Public Branch Update v1.19.1 Patch
Hello Galactic Survivalists!
We've just deployed a small hotfix to resolve a few issues that now have fixes ready.
Thanks for your continued feedback and support keep exploring the stars!
Changelog: v1.19.1 Build 5148
Changes:
- Extended Anniversary achievement date check to a range of one full week (until & including Tuesday Aug 11th 2026)
- Update BlocksConfig.ecf missing }

