Skip to content

Releases: athei/wow-mods

v1.9.0

Choose a tag to compare

@github-actions github-actions released this 11 Aug 18:54

A small one, said plainly

1.8.0 and 1.8.1 were the large performance releases. This one trims a single piece of the collision code and you are unlikely to feel it: in a crowded street it is worth a fraction of a percent of frame time. It is here because the change costs nothing and leaves movement behaving exactly as it did, not because it is dramatic.

What changed

The routine that clips collision shapes was moving far more memory than it used. Every call began by clearing a block it then threw away unread, and every call that did real work copied a fixed 240 bytes for a shape that averages three corners. It now touches only the part it actually reads, which takes about fifteen percent off a routine that runs roughly a million times a second when a lot is moving near you.

The loop that feeds it was also rebuilding its scratch space once for every surface it considered, rather than once per pass. That is fixed too, though it turned out to be worth very little.

Movement is unchanged. The new version was checked against the original on live data for a full session and produced identical results every time.

Diagnostics

RUST_LOG=wow::perf=debug now reports more about the collision path, including how many surfaces each movement check looks at and how each one is resolved. As before, it is off unless you ask for it, it costs nothing while off, and you do not need it for anything.

Compatibility

Nothing to change. Install over 1.8.1 the way you did before, keep your settings, and no other mods are affected.

v1.8.1

Choose a tag to compare

@github-actions github-actions released this 11 Aug 15:28

Combat text from addons and scripts is fixed

Text pushed into the combat text overlay by an addon or a macro came out wrong. The message and the style were being read where the colour values should have been, so a red critical hit arrived as a yellow number with the text missing. The colours were read on the wrong scale as well, so a fully saturated channel came through as almost black rather than bright.

Both are fixed. Damage numbers the game creates itself were never affected, so if you only ever saw those, nothing was broken for you and nothing changes now.

If you write scripts

The command is UnitXP("addCombatText", style, text, r, g, b), with colours running from 0 to 1. That is the order every addon was written against. Anything written against the order 1.8.0 happened to accept will need updating.

Compatibility

Install over 1.8.0 the same way and keep your settings. No other mods are affected.

v1.8.0

Choose a tag to compare

@github-actions github-actions released this 11 Aug 14:31

Faster frames where it is crowded

This release is all performance. In a busy city the game thread does roughly eight percent less work per frame than 1.7.0, and the gain grows with how much is happening on screen: crowds of players, packs of creatures, heavy spell effects. Quiet zones will feel about the same, because there was less there to save.

What changed

Model animation no longer waits for all of it to finish before the frame carries on. The frame now picks up each model the moment that model is ready, so the work overlaps with everything that comes after it instead of blocking on the slowest one.

The draw list, which decides what order the world is drawn in, is sorted with a faster algorithm and a cheaper layout. Sorting a busy scene now costs a little over half what it used to.

Collision, the part that works out where things can move and what the mouse is pointing at, had one arithmetic operation in its innermost loop that cost more than everything around it. Removing it cut that routine's cost by about forty percent, and it runs a million times a second in a crowded street.

Diagnostics

Setting RUST_LOG=wow::perf=debug prints a per-minute breakdown of where frame time goes. It is off unless you ask for it and costs nothing when off. You do not need it; it exists so numbers in bug reports can be checked.

Compatibility

Nothing to change. Install over 1.7.0 the same way, keep your existing settings, and no other mods are affected.

v1.7.0

Choose a tag to compare

@github-actions github-actions released this 11 Aug 08:11

Character animation runs across worker threads

Posing every animated model in view happened on the main thread, and a crowded city or a full raid is a few hundred of them per frame. That work is now spread across the worker pool, and the main thread only waits for the last one to finish instead of doing them all itself. Measured on a busy city scene, the animation phase costs the main thread about a quarter of what it used to. Nothing about the animation itself changes, and a scene with only a handful of animated models keeps the original scheduling.

The worker pool shared by this and the particle build grew from three lanes to four, which is worth roughly another percent of frame time on a machine with six or more performance cores.

Log filter names changed

If you turn on diagnostics, the filter names are different. RUST_LOG=wow::events=debug is gone. There are now five topics, grouped by what you would switch on together: wow for identity and environment, wow::hook for what got patched and what refused, wow::gc for the Lua collector, wow::script for what the interface costs, and wow::perf for the mod's own counters.

The last two are separate switches now. The per-second script tables are the expensive measurement; the counters are free. Reading the counters no longer turns the script gauge on with them, so RUST_LOG=wow::perf=debug is the cheap way to see how the parallel work is doing. That report gains a line for the animation split: passes, how long the main thread spent waiting, and how much work the workers absorbed.

Compatibility

Drop-in replacement for 1.6.0. No gameplay or configuration change, and WOW_TURBO_SKIP=all still disables every hook without a reinstall.

v1.6.0

Choose a tag to compare

@github-actions github-actions released this 10 Aug 17:29

Floating combat text is built in

combatTextSP3 no longer answers like a renderer that failed to start. Enabling it draws the floating damage and healing numbers, the crit carousel and any line a script adds, on the same rise, arc and fade curves as the original. That was the last piece of the UnitXP(...) command set wow_turbo did not serve.

The renderer is deliberately not a copy of the original's, which rasterizes through system fonts and d3dx9 objects that Wine substitutes differently on every machine. Here each line is rasterized once from a font file into a texture that survives a device reset by definition. The face is whichever one the addon's font box names: any of the client's own fonts, or a system font by its file name. It defaults to FRIZQT__, the face the client itself floats text with. Worth knowing: the addon's edit boxes only apply on Enter, so typing a font name or size and clicking away changes nothing.

Particle-heavy scenes cost the main thread less

Building the vertices behind every particle emitter on screen happened entirely on the main thread, and a crowded fight is hundreds of emitter draws per frame. That work now runs on worker threads while the main thread walks the scene, and each result is moved into place at the moment its draw needs it. Any draw whose result does not match what the frame actually asks for is built the old way instead, so what you see is the same either way.

Diagnostics

With RUST_LOG=wow::events=debug the per-minute summary gains a line for the parallel particle build: how many draws it served, how long the main thread spent waiting on a worker, and anything that fell back.

Compatibility

Drop-in replacement for 1.5.2. No gameplay or configuration change, and WOW_TURBO_SKIP=all still disables every hook without a reinstall.

v1.5.2

Choose a tag to compare

@github-actions github-actions released this 08 Aug 17:12

Less time spent placing floating frames

Frames the interface positions to sit clear of the ones already on screen went through a search that rebuilt its working queue from scratch on every placement, and grew that queue through the process heap several times along the way. In a crowded outdoor scene that was a measurable slice of the interface's frame cost. The queue is now reused between placements and the reallocation is gone, with the search itself unchanged.

Repeat lookups in the game's data archives are remembered

The client asks the archive layer for the same files over and over, and wow_turbo keeps a memo so the second ask does not walk the archives again. Until now only the misses were remembered: every successful lookup went the long way round, through the stock hash probe under two locks. Successful lookups are now remembered too, recorded in whatever form the caller asked for, so the ordinary file-open path is served from the memo. Mounting or unmounting an archive discards the memo, so a newly mounted patch is picked up.

Diagnostics

With RUST_LOG=wow::events=debug the per-minute summary gains a line for the floating placement search: how many placements ran, and how much work each one did.

Compatibility

Drop-in replacement for 1.5.1. No gameplay, interface or configuration change.

v1.5.1

Choose a tag to compare

@github-actions github-actions released this 08 Aug 09:50

Diagnostics that actually cost nothing when they are off

The instrumentation in wow_turbo is meant to be inert unless you turn it on with RUST_LOG. Two parts of it were not. The appearance-write coalescer and the archive file lookup kept counters running for every player, on paths the client takes constantly, even though the numbers they feed only ever print with the diagnostic filter enabled. Every counter now sits behind the same switch as the rest, so a normal session does none of that bookkeeping.

There is no gameplay or compatibility change from 1.5.0, and the files are a drop-in replacement.

If you do play with RUST_LOG=wow::events=debug, the per-minute summary is tidier: a feature you never use no longer prints a row of zeros every minute, the built-in UnitXP command set reports each feature on its own line instead of packing several into one, and the archive-lookup counters join that summary instead of reporting on a schedule of their own.

v1.5.0

Choose a tag to compare

@github-actions github-actions released this 07 Aug 16:06

UnitXP_SP3 is now built in

wow_turbo serves the UnitXP(...) command set itself, so you can delete UnitXP_SP3.dll. Line of sight, the distance meters, behind, targeting, the nameplate filters, the camera offsets and follow mode, weather suppression, FPS caps, script timers, notifications and screenshot re-encoding all work as before, and the companion addon runs unmodified, panel and keybindings included. Sight answers come from a position-aware cache that traces the world roughly twenty times less often than the original did, which was a real slice of frame time in a crowded city.

Two deliberate differences: the floating combat text overlay is not built in yet, so those commands answer exactly like the original does when its renderer fails to start and stock combat text stays; and the remote Lua debugger, the TCP tweaks and the math detours are gone, the math because wow_turbo already owns those functions.

Nameplates cost much less in cities

Turning nameplates on in a busy zone used to cost real frames, and most of that was the engine anchoring and laying out each plate as it was added. That work is now native and reuses anchors instead of rebuilding them, taking it from about 6.5% of frame time down to about 1.5% with plates on in Stormwind.

Appearances stop rebuilding models twice

Equipment appearance changes arrive from the server as a blank followed by a restore on the same field, and the client rebuilt a model for each half. Both halves are now folded into one when the restore arrives promptly, so browsing appearances and standing in a crowd of transmogged players is smoother. The client also only checked the file system for art on some lookup paths, which left loose custom files unreachable on the others; that check now runs on every path.

Together these replace transmogfix.dll, which you can delete.

Compatibility

Four mods are now covered and should be removed: libSiliconPatch.dll, weirdperformance.dll, UnitXP_SP3.dll and transmogfix.dll. SuperWoW and nampower are fine alongside; load them first. If anything misbehaves, WOW_TURBO_SKIP=all disables every hook without a reinstall.

v1.4.5

Choose a tag to compare

@athei athei released this 06 Aug 22:11

Fix release on top of v1.4.4, plus a performance improvement.

GetName returns unit GUIDs again

v1.4.3 taught the mod to take back the GetName entry after another mod overwrites it at world entry. That take-back served names only, so addons that call GetName with an argument to read the unit's GUID (some nameplate addons do this, TankPlates among them) stopped getting GUIDs and could misbehave. GetName now serves the GUID whenever a GUID-capable mod (SuperWoW or nampower) is installed, and the take-back also engages when only nampower is present. A latent bug going back to v1.4.1, where a unit carrying a zero GUID could crash the client through the name cache, was fixed along the way.

Draw lists sort faster

The client sorts its draw lists every frame with comparators that re-read both elements' sort fields on every comparison. Two of the sorts now compute a compact key per element once and compare keys instead, and a third that bounced every comparison through a hook detour now calls its comparator directly. The result is bit-identical draw order at roughly half the sorting cost; on our reference machine that is about two percent of frame time back in busy scenes.

More diagnostics in the performance log

The performance log gained counters for the collision and trace workload, next to the existing animation and particle lines, and the cheaper timing mode for machines with slow clock reads has now been exercised end to end. If you capture logs or profiles for us, capture your next raid on this version; it supersedes v1.4.4 for that purpose and everything in these notes rides along.

v1.4.4

Choose a tag to compare

@github-actions github-actions released this 05 Aug 13:38

Fix release on top of v1.4.3.

Profiling captures now show full call stacks

The mods are now built with frame pointers. Profiles captured on your machine previously could not attribute time inside the mod DLLs to their callers, which made captures from the field much less useful than local ones. If you profile for us, capture on this version; v1.4.3 profiles have no stacks out of the mod code.

This may cost a small amount of performance on the 32-bit client in exchange. If you notice a difference, tell us; the perf logs across versions will show it either way.

Everything else is identical to v1.4.3, including the GetName reclaim and the cheaper performance logging. If you skipped v1.4.3, read its notes; capturing your next raid on this version helps us most.