- Entering the world used to show an uncovered, movable world before the screen
came up — seconds of it on a slower machine ("like the Stormwind intro
video", as one report with video put it). The screen also cleared onto bare
terrain with the buildings still streaming in, and could hang forever if you
arrived swimming or flying. It has a real lifecycle now: it rises at the
entry edges (character pick, transfer, teleport), clears only when the scene
is actually presentable — terrain, buildings, props and their collision all
resident — and its physics hold releases in every movement mode, not just
walking. The progress bar counts buildings too.
- A far teleport flashed a frame of the destination before the screen rose.
The "swap never flashes" guarantee existed only in comments — a streamer
rework had silently dropped the scheduling constraint that enforced it; it
is structural now. And logout got its missing cover: the original's plain
black cut, not a frame of torn-down world.
- Animation parking now governs everything with a rig. ~350 animated objects
(braziers, doors, chests) were sampling their loops off-screen forever, and
a patrolling parked mob kept writing pose data nothing could read — ~620 rig
refreshes a frame became 7, and creatures in rooms the camera can't reach
through any portal park too.
- The engine's own tax got measured: bare Bevy spends ~3.9 CPU ms a frame on
this machine drawing nothing at all, which resets what "fast enough"
honestly means for everything built on top of it. A shipping build profile
(fat LTO) landed alongside — worth about −1 ms at the pin, kept out of
everyday builds.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
51 lines
2.5 KiB
TOML
51 lines
2.5 KiB
TOML
[workspace]
|
||
resolver = "2"
|
||
members = ["crates/*"]
|
||
|
||
[workspace.package]
|
||
version = "0.1.0"
|
||
edition = "2021"
|
||
license = "MIT OR Apache-2.0"
|
||
authors = ["sam <samuv.eth@gmail.com>"]
|
||
|
||
# Shared pins live here; promote a dep the moment two crates pin the same version (the policy
|
||
# since day one, enacted at the 0530 debt sweep). Per-crate feature additions stay in the crate.
|
||
# `image` deliberately stays per-crate: its default-features/feature sets differ per consumer,
|
||
# and a workspace default-features choice can't be subtracted from downstream.
|
||
[workspace.dependencies]
|
||
anyhow = "1.0.102"
|
||
bevy = "0.18.1"
|
||
clap = { version = "4.6.1", features = ["derive"] }
|
||
|
||
# No `[patch.crates-io]`: the WoW format + protocol stack is fully in-repo (decision 0021), so there
|
||
# are no warcraft-rs / wow_messages crates (or forks of them) anywhere in the tree.
|
||
|
||
# Optimize *dependencies* even in dev builds. avian/parry collision math (and wgpu/bevy render) is
|
||
# unusably slow at opt-level 0 — a plain `cargo run` crawls to <1 fps once physics is doing real work.
|
||
# opt-level 3 on deps (the standard Bevy fix) makes debug builds playable while our own crates stay
|
||
# lightly optimized for fast incremental rebuilds. One-time cost: deps recompile optimized the first time.
|
||
[profile.dev.package."*"]
|
||
opt-level = 3
|
||
|
||
# Our own crates at opt-level 1, not 0: Bevy's generic hot paths (material specialization scans,
|
||
# query par_for_each closures) monomorphize INTO our crate, so at opt 0 they run at debug codegen
|
||
# speed over every resident entity — measured at Stormwind as the difference between ~45 fps and a
|
||
# pinned 60 (decision 0362). Warm incremental rebuild cost measured at ~zero. NB: FPS probe numbers
|
||
# in decisions ≤ 0361 were taken at opt 0 and are not comparable with post-0362 probes.
|
||
[profile.dev]
|
||
opt-level = 1
|
||
|
||
# No debuginfo trimming: `debug = "line-tables-only"` was A/B-measured (decision 0192) at zero
|
||
# recurring win on this stack (macOS unpacked split-debuginfo; sccache; fast ld) — not worth
|
||
# invalidating every warm target and the sccache cache for.
|
||
|
||
# Shipping-grade optimization, A/B-graded at the pin (decision 0736): −1.0 cpu_ms (−5 %) vs
|
||
# default release, flat at the empty-map and bare-Bevy floors. The campaign keeps grading on
|
||
# default `release` — same-day A/B is the law, and fat LTO's link time would tax every
|
||
# iteration for a constant offset. Build with `--profile ship` for actual releases (add
|
||
# `RUSTFLAGS=-Ctarget-cpu=native` for a machine-local binary; not set here — it isn't portable).
|
||
[profile.ship]
|
||
inherits = "release"
|
||
lto = "fat"
|
||
codegen-units = 1
|