3,177 Commits over 761 Days - 0.17cph!
Merge: from mt_snapshot_saving
- Bugfix for HittableByTrain components not saving in Jobs 4 mode
Tests: spawned a tall wooden barricade with Jobs 4 enabled
Bugfix: cache owner entity of HittableByTrains on init
Avoids lookups while running SaveComponent
Tests: spawned a wooden double barricade with jobs 4 enabled
Merge: from async_serveroccl_gen
- Optim: 4.5k server occlusion grid now generates in 22s, down from 45s
Tests: unit and perf tests, 2p on craggy to validate server occlusion, visualized 4.5k map occl grid results
Clean: extract GetBatchSize and WaitForTasks into ThreadingUtils
Tests: ran compile simulator
Update(editor): add heightmap sample and isInside visualization to server occlusion editor debug
Spent too long chasing non-existent domain reload ghosts
Tests: visualized occlusion of EU East 1. tested occlusion gen on craggy with 2p
Bugfix: avoid out of bounds access in FindComponent<T>
- also add editor ifdef guards for editor attribute
Results array can be oversized, since we reuse it
Tests: ran unit tests - pass
Optim: tweak batch size when calculating server occlusion narrow phase
This cuts down 4.5k world server occlusion generation from 45s to 35s in batched mode. Async further brings it down to 22s
Tests: ran generation in editor
Update: make UnsafeScriptingAccess initialize on editor load
Allows to use it in editor-only tools/workflows
Tests: ran server occclusion generation in editor, checked profile
Update: add GamePhysics.FindComponent<T> that supports async
Configured async to engage at more than 4 batches of 64 queries
Tests: ran perf tests. same perf up to 400 points, at 10k points is 2x faster 0.42ms batched+async vs 0.96ms batched vs 5.4ms serial
Update: add TerrainMeta.SampleTerrainMeshHeights
Configured to engage async after have more than 4 batches of 256 pos each
Tests: ran perf tests
Update(tests): add IsInsideTerrain perf comparison tests
Need them to tweak when to engage async and when to skip it internally
Tests: ran them
Merge: from mt_snapshot_savings
- Bugfixes for a couple unsafe Save codepaths in Jobs 4 mode
- Added debug utility in InvokeHandler to track down a thread race in Jobs 4
Tests: unit tests + gameplay on craggy
Bugfix: make Underwear.ValidateForPlayer MT friendly on server
Fixes BasePlayer saving throwing unity exceptions
Tests: changed underwear with Jobs 4
Bugfix: make FishMount.Save mt friendly - cache fish container index
Tests: placed a fish in a trophy display with Jobs 4
Update: wrap InvokeHandler internals in DebugMTLock
Tests: booted on craggy and ran around with EnableDebugMTLock
Update: add single-thread reentrant support to DebugMTLock to avoid deadlocks
- added unit tests
Because of course InvokeHandler is non-trivially recursive
Tests: uni tests
Update: Move UnsafeScriptingAccess and DebugMTLock to Facepunch.UnityEngine
- Cleanup empty asms
Tests: ran relevant unit tests
Update: explicitly capture callstack when DebugMTLock is tripped
- frame count can be limited to via unsafe.DebugMTLockMaxFrames (def 5)
Tests: ran unit tests
New: DebugMTLock - a named lock guard that print an error on concurrent access
- controlled by Unsafe.EnableDebugMTLock, disabled by default
- codegen, unit tests
Need it to help chase down unobvious thread races, like InvokeHandler
Tests: ran unit tests
Optim: Jobs 4 - reduce server.ParallelNetworkQueueBatchSize to 16 by default
256 was waaay to high for the per-frame workload we get, it basically disabled parallelization
Tests: none, trivial change
Bugfix: fix 6 TestMTSave failures
No legit mt issues, just new entity types with missing unit test setup
Tests: ran all TestMTSave tests, pass
Bugfix: make card table saving MT-friendly
Done by removing the concept of item "busy" or "locking" - was never set but checked against Time.time
Tests: none, trivial change
Bugfix: cache rocket ammo def to avoid get_gameObject calls in AttackHelicopterRockets
Tests: spawned attack heli and geared it up - could see them in inventory
Merge: from vehicle_pooling
- Buildfix for BallistaGun
Buildfix: wrap Ballista private members in relevant mode guards
Tests: ran compile test
Merge: from hackweek_unsafescriptingaccess
- New: utility to bypass Unity's thread safety checks and conditionally execute code in async (Unsafe.UseMultithreadedScripting convar, def 1)
Tests: unit tests, manually built & ran all flavor combinations of executables, tried mac and win editors
Update: grab binaries from the merged PR
- addesses review feedback, functionality is same
Tests: ran unit tests on Win
Update: mark UseMultithreadedScripting explicitly defaulted to enabled
It kept disabling it despite underlying var being enabled
Tests: booted into craggy, looked at var state in console
Update: codegen
Tests: none
Clean: unify style, add comments
Tests: none, trivial changes
Clean: missed meta file deletion
Tests: none, trivial change
Update: move UnsafeScriptingAccess to Facepunch.Unity
- add unit tests
- delete old TLStest and it's scene
Tests: ran unit tests
Update: re-enable the feature for clients as well
- add editor only RustNative_Editor
- rewrapped the code behind UNITY_ASSERTIONS
Tests: built all flavors of Rust locally (win, linux, mac | client,server | debug,dev,release) and ran them, got passes everywhere
Bugfix: make sure we modify EnsureMainThread in release builds
That check is always active
Tests: booted TLS scene
Update: integrate TLSTest into client bootstrap and server boot routines
- copied over linux rustnative.so, to be tested
Temp measure to test standalone builds
Tests: booted both bootstrap and craggy in win editor - saw output (disabled in client, enabled in server)
Update: replacing with a remotely built dylib
Surprisingly, it works
Tests: ran TLS test scene
Update: add MacOS support for UnsafeScriptingAccess
- using locally built debug dylib for now
Need to figure out if remotely built dylib is going to work or not (didn't when I broke sig locally)
Tests: using locally built dylib was able to run TLSTest setup
Update: consolidate OS specific calls to RustNative
Still gotta build and test linux and mac, gonna do that tomorrow
Tests: ran temp scene
Update: disable Unsafe.UseMultithreadedScripting on CLIENT
- codegen
Need to figure out how to better patch out the managed check when doing an IL2CPP build, will leave that for later
Tests: tested booting test scene both in CLIENT(ran on main thread) and SERVER(ran on thread pool) modes
Merge: from mt_snapshot_saving
- Bugfix for thread race in Jobs 4 mode when saving BasePlayer
Tests: booted craggyisland_missions, completed a mission
Bugfix: avoid a thread race on PlayerState MRU dictionary when saving BasePlayer
- use readonly access in Save that doesn't update MRU
- push to cache on player connect
Tests: ran CraggyIsland_missions, completed a mission - saw states change in UI
Update: avoid calling db queries when saving BasePlayer.PersistentPlayerInfo
- instead resolved on player join
It should be safe according to docs(mt calls are serialized), but this way is just simpler.
Tests: booted into craggy
Update: implement UnsafeScriptingAcccess.SwitchToMultithreading awaitable
Works with ConVar.Unsafe.UseMultithreadedScripting to either keep task on main thread of offload it to thread pool
Tests: TLSTest script, with covnar being in both states after system runs