branchrust_reboot/main/parallel_validatemovecancel
108 Commits over 31 Days - 0.15cph!
Bugfix: when we're missing TerrainCollision or WaterCollision, run all of the physics checks for trigger volumes
- Added UtilityJobs namespace, moved FillJob<T> to it
- Added a utility extension to NativeList<T> to copy from NativeArray<T>.ReadOnly (surprised it's missing)
Tests: all relevant unit tests
Clean: remove GamePhysics.OverlapSphere(batch) and GamePhysics.OverlapCapsule(batch)
- These have been inlined into CheckSphere<T> and CheckCapsule<T>
- Also updated CoarseQueryGrid.CheckJobIndirect(capsule) (returns JobHandle, works on a NativeList) since I missed it in previous commit
Tests: ran all unit tests
Update: CoarseQueryGrid - add non-indirect CheckJob API
- Also changed the API to return a JobHandle and accept a NativeList
Helps avoid extra busy work when we run direct work
Tests: ran unit tests
Bugfix: prevent WaterCollision.GetIgnore from returning garbage values
Another case that's the same as previous
Tests: none, trivial change
Clean: move all CoarseQueryGridJobs to it's own namespace
- rename the jobs to avoid duplication with namespace
Tests: compiles in editor
Bugfix: make sure TerrainCollision.GetIgnore doesn't return garbage values
Same bug as in WaterCollision that I fixed last friday.
Tests: none, trivial change
Bugfix: WaterCollision.GetIgnoreIndirect properly fills entire result set
Tests: ran unit tests + staging demo playback
Tests: adding TestWaterIgnoreConsistency to further narrow down what is going wrong
Tests: ran new unit test, it does fail as begrudgingly expected
▇▋▊▇▍: █▋▅▍▅▊ ▍▋▍██▅▍▉ ▊▋▅▋▌ ▆▉ ▋▉▅█▊▅ ▋▌▌█ ▌▆▉▆▌█▉ ▆▉▌▉ ▍▅▋▉ ▍▋▋▋▆▄▋▅█
- ▋▅▄█▉▉ ▆▌▅▍▉▌ █▇▋▇▉█▇▇ ▄▋▇▇▍ ▊▇ ▄▅▉█▄ ▅▄█▊▇▅ ▋▄▊▋▌▅ ▅▋▉█▍▇, ▋▊█▋▇▍ ▋▊▉▌ ▅▆▊▊ ▉ █▊▇▌▅▍ █▊▆▋▆▍▆▆
▅▅▍▄ ▋▋▋▊█▋ ▉▌▋▉▌▍ █▄ ▅▉▊▄ ▅▉▋█ ▇▍▆▍▅ ▍▉ █▇▋▅▅▍ ▌ ▋▌▆▊▇▇▆▌ ▋▇▇▆'▋ ▊▉▅▍█▇▇█▌█ ▉▉▉▆▆ ▅▅ ▋▆▅▇ ▋▌▌▉▅█▅, █▆▌▉▌ ▅▍ ▍▆▌▋▌▉█▍█ ▊▄▌▄ ▍▋▊▉▄▅ █▌▋▆█▆▌▅. ▍▉▉ ▍▋▇▇ ▇▍ ▆▄█▉, ▌▌ ▇▅█▇ █▅ ▋▊ ▆█▋▋▄▅▍ ██▍ █▉▇▌ ▋▇▉▊▊/▋▇█▊▊▊▄▇▅ ▍▌▇▍▅▍▆. █▄▊▆, ▅▍▌▉ █▅▇███▅ ▌▌▉▍▆▋▌▅▄▄ ▌▌█▊▉ - █▇▇▊▆▆▍▇█▌█▍▅.
▉▆▉▌▊: ▋▄▉ █▆▋ █▊▍▉▆▇▅▇ ▍▍▊▄▄
▇▍▉█▊▇: █▉▅▊▊▍▍▍▇▄█▋▍▋▋█▌ - ▌▍ ▋▍▇▋▍▅▄█ ▇▋█▌▊▉ ▅▅▄█▊█▉▋▉▍▊▍, ▊▄▄▅ ▍▅▋█ ▌█ ▅▌▅▉ ▊▉ ▊▆▌ ▆▌▅ ▋▉▊▄ ▅█▇
▄▇▇▄▄: ▉▄█▅▌▆ ▄▅▋▋ ▄▅▆▅▋▄▅ ▇▄█▄
▅█▅▌▅▌: ▄▉▊▆▌▊▊▋.▍▊█▆▉▄▅▉▋▊▋▄▊ - ▌█▇▊ ▌▊▄▉ ▍▌ █▉▇▍▊▉▇▄▄▊█▋▅▉▆▆▉▋▉▊▉
▄▅▆▅ ▅▇▉▍▍▊▅ ▄ ▋▍▋▆▅ █▍ █▉▋█▆
▅▇▋█▉: ▄▆▄▆▇▇▇ ▄▋▉▆ ▋▅▄▄▆▋▇▉
Optim: FinalizeTickParallel - use a burst job to gather players to validate for tick history
- Cleaned up a bunch of code by switching to NativeList from NativeArray
- more TickInterpolatorCache usage
Tests: staging demo playback
▍▅▉▅▉: ▌█▉▊▆▍▇▅▉▇▊▄▇▇▍▄▉ - █▌▄▍▋▍▆ ▌▋▋█▌▋▉▆ ▍▅▋ ▌█▍█▌▍ ▍▆▍▄▉ ▊█▍▅ ▇▊▋▅▊ ▅▉▇▋
▉▅▍'▇ ▋▋▇ ▄▅▉▅ ▉▉ ▄▍ ▄▍█▍▅▆ ▅▇█▊█▌▉ ▌█▊▆▅▅▌▋ ▄▉█▆▋▉█ ▍▌▉▋▊ ▋▅▊▊ ▊▅▉▇.
▌█▊▇▌: ▌▆▊▍ ▍█▇▅▆ ▄█▍ ▋█▋▊█▊▅ ▊▆▋▋ ▌▄▊▍▊█▌▉
▇▊▄▄▇: ▉▆▄▄█▆█▋▍▌█▍▆▆▄▇▇▉▄▉▋ █▌▌ ▌▌██▊ ▄▇▅▉▆▍▍ ▄▅▌▆
- ▉▆▅█▇▄▇▌▍ ▅▍▄ ▄▉▊▄█▆ ▆ ▉▋▄▄▍█▇ ▇▍ ▆▄▇▆ ▋▌▍█▆▇█ ▌▉▊█ ▉▄▇▅▄ ▊▌▉▌ ▍▇█▉▅▆ ▄▄ ▊█▉▌▌▋▇▅▊, ▅▌▄▋▇▍▅ ▉█ ▌▅▆▇▆▇ ▉█▆█▇, █▆▍ ▇█▆▅ ▄▉▋▆▍ ▍▇▉▄ █▅▉▇▆▍▋ ▇▌ ▋▆▅ ▅▇▇█▍▋▅▌ ▌▋▇▅▌▄▍ ▋▉ ▅▆▍▊▆▄
▇▋▄▅█▉▊▉▊ ▍▍▌▆▇▋▄ ▆▆▊ ▆▋▋ ██▅▄▍▌▊ ▉▆▉▌▇▄ ▋▌▊▊▆▅▆▊ - ▅▍▆▋▇▋▅▄ ▋▄ ▄▆.▉▇▊(+▍.█▊▌) ▌▅▋ █▍▌▇▄▆ ▉▉ █▄(+▉▅▆)
▉▍▆▉▄: ██▉ █▌▄▉█▆▋ ▅▊▇▇▉
▅▇█▇▋: ▉▊▄▄█▇▆▆▌▆█▊▆▄▍▇▇ - ▆▆▋▉▉▌▊ ▇ ▍▇▆█▆-▄█▅▍█▌ ▌▉▍▄▉▉▄▊▇▄ ▋▄▇▉ ▋ ▄▆▊▅▍▋█▊▉▍▄
▋▉▆▍█▇ ▊.▅█▌ ▆▆ ▆▄ ▉▅▇▇ - ▅▇.▌▍█->▍▆.█▋█, ▄█ ▌█▄█ ▋▉█▇▉█. █▆▄▍▋▍ █▄█ ▊▄▇▇ ▊▅▋ ▄▆▊▍ ▉▅▄▄▍▌▆▋▆ ▄▊ ▍▋▋▍▊.
▌▉▅▇▄: ▊▄█▇ ▉▄▇▇▍ █▅▊ ▊▌▆▅▄▄▌ ▊▋▌█ ▍▅▊▉▋█▌▉
▋▉▋▋▌: ▊▍▍▅▌▆▆▆▉█▉▋▉▆▅▌▊ - █▍█▇▉▆▍ ▌ ▇▉█▌▍ ▆█ ▉▍▄▊▄▍▋ ▆▅▋▄█ ▌▊▌▉ ▆▋▄▅▌ ▆█▄▋
▍▆▉▋▋ ▇.▊▅▄ ▅▊▆ █▋▋ ▋▊▇▊ - █▋.▄▆█->▍▆.▅▌▅ ▊▆ ▉▄▍▄ ▊▅▉▇▇█. ▆▌█▆▇▌▍ ▆▇▅ ▍▋▉▄ ▌▄▅▋ ▉▅ ▋▄▇▍▄▅▉▊▄▉▄ ▍▆▄▉▆▋▅. ▊▇▅▉ ▋ █▇▋█▍▆ ▉▍▌▋▆ ▋▅█▉ ▆▅ ▆▇▆▌▄▄█▉
█▊▆▄▄: ▆▍▅▇ ▍▊▆▋ ▊█▉▉
▌▉▌▄▅: ▋▇▇▄▊▊▍ ▉▊▉▍▉▄▌▉▉█▉.▍▋█▍▊(▆▅▄▄▊█ > ▍) ▉█▍▄ █ ▊▇▆▋▇ ▅▍▌▋▊▊ ▆▅▌▇
▇▍▌▇▊▌ ▊▅▌▉▊▇▄ ▋▄█ ▊▍ █▍▆ ▆▋▊▊ - ▉▅.▌▊▉->▌▌.▌▅▊ ▉▉ ▊▇▊▍ ▆▇▆▊▌▌
▄▋▅▄▆: ▋▌▅▄ ▆▆▊▅▊▋▉▇ ▋▋▉ ▍▄▉▍ ▍▊▋▍
▇▄██▆: ▉▉▇▇██▌█▆▅▅▇▇▆▄▊▅ - ▌▇▊▇▄▄▅ █▍▆▋▍▆▉▅▍▆▍.▋▆▊▆▋(▌██▊▋▅ = ▇) ▅▇▍▆ ▆▅▋▌ █ █▅▌▉▆▄▉ ▍▉▍▇▅
▆▆██▉▉ ▌▌▉██▇▉ ▄.█▄▄ ▇▍▅ ▇█▆ ▄▋▋█ - ▋▍▉▄->▋▋.▆▌▄ ▉▋ ▋▊▍▄ ▍▄▋▉▍▅
▉▉▌▆▍: ▅▋▌▍ ▇▋▌▅ + ▄▌▄▇▋▊▇ ▅██ ▇▉▇▆▇▉▆▇
▄▉▅▌▋▄: ▅▇▌▄▊█▅▍▋▊▆▍▍█▄▅▌ - ▅█▉▋▊▌▋█▄▍▊▅▄▆▋▆▅▉▍▋ ▍▇▆▇ ▆█▅▋▍█▌▉▍ ▋▍▇▅▇▉█▄▉▉█▉▌▋█ ▉▋▋ ▌▅█▌▋▆▆█▅▋▄▉▊▄▅▅▆▆
▇▄▋▄ █▋ ▇▌▋▌ ▇▋ ▊▆▅▊ ▄▇█▌ ▆▅ ▍ ▌▇▋▍▄ ▍▇█ ▊█▅▅▊. ▍▌▋▋, ▉▍█▇▄▇▄▌▇ ▍▄▋▊▇▍▆▄▌▊▊.▋▇▌▇▇ ▊▇ ▉▄▉▊▅ ▊▋ ▇▇ ▊ ▉▌▍▊▅
▊▍▇▋▄: ▄▆▌▊ ▄▅▄▍▅ ▄▄▄ ▇▄▉▋▌▆▌ ▄▍▄▊ ▉█▄▊▍▊▋▌
▍▄▌▊▊: ▊▅▋▆▇▆▋▆▍█▉▄▍ - ▅▅▅ ▄▍▍▊▍ ▋▊▌█ ▋█ ▇▌▍▋▆ ▍▆▊▆▌▅▊ ▄▊▉ ▌▊▆▇▌▇▍▋▌▅▌▄▋▍█▍▌
▉▌█▇ ▍▊▇▄▋█ ▌▇▌▆▌▍█ ▍▄▉ ▄▍ ▄▇▅ ▅▊▇▍▉▋ ▋▍▇▄ - ▆▆▅▌ -> ▍▍▆▅, ▍▄ ▇▍▍▍ ▅▇▍█▇▋
▊▋▅▅▌: ▄▍▅▅ ▋▅█▉ ▅▊▋ ▆▄▄▊▌▋▅ ▆▌▅▋ ▇▌▅▋▇▉▊▇
▄▅▆▊▅▇: ▌▅▊▌▇▅▇▅ ▋██▅ █▉▄▄▉▊ ▊▋ ▇▌▄▇▆▇▋▇▊▅▊█▌ ▄█▌ ▆▋▍▍▋▌▊▆▆▇▄▉█▍▉▉▍
- █▄▍▅ ▇▊▍▇▍█▊ ▋▄▇█▅▅▌▌▋▊▍ █▅▋▄▍ ▇▆▌▋▉ ▅█▇▍█ ▋▌▅▍▉▌▇▄█▆.▄▉█▇▅▋
▋▇▉▉▋: █▇▋▊, ▅▄▋▄▊▉▍ █▊█▍▋▋▄
▄▉▌▆▆: ▊▍▅█▅▌▊▍▅▇▆▉▍█▋▌▉ - ▆▍█ █▊▊█▊▉▌.▍▇▍▄▄▄█▌▍▇▅▉▌▆▄▌█▍▄█▉ ▅▄ █ ▇▌▋▌▄▆ ▋▋▊▄▊
- ▊▅▇ ▅▉█ ▉▌ ██▋▄▆▇▋ ▅█▊▄▆▌▆ ▉▋ ▅▇▊▌▊▊ ▇▌▌▉█▊ ▅▋█▄▄ - ▆▊▍▉▋▉█ ▆▅▆▄▉▋▌ █▉▉▍ ▆▋▊▆▌▅▌ ▆▊▌▅ ▍▋▅ ▄▅▉▊
▊▅█▋▅ ~▊█▇, ▆▇▄▋->▄▄▊▌. ▆▆▇▄▋ ▌▋ ▉▌▊▅ ▆▉▍█▉▆ ▌▍█▉█▊▄▌█▌█ ▅▌▌▄▇▌▍ ▌▌ ▉▌'▌ ▇▍▍▉ █▆ ▌▇▌▉ ▉▆▅▅▆▌▉▆▆ ▆▍▆▇.
▍▋▅▌▊: ▄▊▋▋ ▍▅▄▉▉ + ▄▊▉▊▉▊▊ ▇▊▍▅ ▊▄▆▉▆▊▌ ▅▉▍▋
▇▄▇▅▍: ▆▊▊▌▆▅▋█▉▌▄█▌▆▌▅▇ - █▆▍▆▇ ▉▄▊▊▉▍▅▆▌▌▊.▊▄▄▍▆▍▆▌▇▋▍▇█▅ ▍▅▄ ▄ ▊▄▅ ▋▍▅▊▅▊▊▋▇▆▄▆ ▌▅ ▆▋▆▅█ ▍▅▌▉▉▋▆
█▉▌▄▆ ▅▌█▌▄▍ ▇.▄▇▉ ▄▄█ ▍▅▊ ▄▋▇▌▍▆▅, ▄▍▇▊▌▍▅▄ ▍▆.▄▌▇->▇▇▅▌.
▌▄▅▇▄: ▋▅▉▊ ▊█▌█▆ ▆▌▋ █▌▊▆▉▅▅ ▉▅▌▇ ▄▋▆▊▉▉▄▌
▄▍▉▅▊: ▄▇▊▄▅▌▋▌▆▄▇▊▅▍█▆▍ - ▄▇▉ ▆▆▌ ▆▇▉▌▇▌▇▆▆▅▆▄ ▇▄ ▆ ▇▌█▊▉▊ █▌▌▋▆
▆▅▍ ▅▉█ ▋▉█▋ ▊▄█▄▍ ▌▄% █▍ ▌▄▆ ▊▊█▅ ▉▋ ▆▋▉▊▄▄▉▅, ▆▅▉▋->▇▋▊▉. ▋▌'▄▉ ▊▋█ ▇▍ ▍▅▄█▆▋ █▌▄▇ ▊▅▄▍▇▉ (▋▉▍▍)
▅█▇▊▅: ▍▊▄▄ ▅█▇▆▊ + ▄▌█▋▍▇▄ ▌▇█▍ ▇▋▌▊▄▍▆█
▋▌▋▅▇: ▋▅▊▇▍▉▌▆▍▆▊▋█▉▍██ - ▊█▆▅▆▅▇ ▅▇▅ ▋██▊▊▉▌▅▉▅▆▋█▅▌▇▆▊▅▉▊ ██▆▆▆ ▍▅ ▉▍▆ ▆▊▇▅▋▉▊▍▅▊▇█▆▆▌▍▄▇▍ ▍▋▍▋▉
▆▍▅ ██▊ ▊▉▊▌▍▅ ▄▄▄▌ ▊▊▄▍▆ ~▄▆% ▄▇▇▌▌ ▊▄ ▉▇ ▌▌▌▋▇▆, ▉▉▍▋▌->▇▆▋▌ ▄▆ ▅▆▄▌
▌▇▆▋▅: ▄▄▋▌ ▍▉▇▊▆ + ▆▅▇█▇▅▉ ▍█▆▌ ▋▉█▌▉▉▋▉
Update: adding HandleIgnoreTerrain that works on a batch of positions
- also ninja-fixing a bug in batch overload of HandleIgnoreCollisions that screwed layermasks - good thing it wasn't used anywhere
Tests: ran unit tests
█▌▅▋▅▅: ▅▉▅▉▌ ▉▇▋▊▇▇█▍▉▋ ▆▌▅▉▌▇ ▆▇ █▍▌▇▄▆▅▊▄▌▆▄▄▄▆▌▄
▅█▉▍ ███▊ ▌▅ ▍▄▆▆▋▍▆ ▋▊▍▅ ▇▉ ▉▋▆▉▋ █▊▆▊▆█▋▍ ▊▇▍██▋▅▄▅▊▋▊█▅▌▆▉▍▌ ▋▌▄▆▅, ▌▋▅▅▍ ▇▋ ▌▉▋ ▆▌▌ ▅▉█▅▉ █▄▉▍▆ ▇▌▍ ▄▇▉▍▅
▊▅▋▊▊: ▊▍▄ ▋▍▍▅ ▊▌▄█
▊▄▅▄▆▋: ▇▄▉ ▋▆██▄▉▆ ▌█▉▉▍ ▄▊ ▊▆▉▅▅▋ ▍▅█▅▊▊▉▌▅▊ ▌▄█▊▋▄▊ ▋▆▇▆▍ ▉▄▍▆▉▇ █▋▋▉▅▆▊▊▋▆ ▋▇ ▄▇▊▋▋
- █▉█▍ ▉▊▌▍ ▌▉▍▉ █▅█▄▅ ██▌▆ ▍▅ ▍▄▆ ▇▍▌ ▇▌▆▌ ▆▉ ▋▅█▌▅▍▉ ▆▋▊▅▇▄▇▆
▌▍▆▌ ▉▉▇█▌ ▇▆▌▅▉▊▋▋▅▊▋▍▋ ▉▇▍ ▋▊▇▇▍▌▆▊▉█ ▌▍▍▋ ▄▇▊▊▉▌▄█▋ ▅▍▇ ▅▇▉▇ ▅█▍▍ - ▋▌▍▅▌ █▍ ▆▊▄▋▋ ▋█▊ ▇▆▅. ▄█▌▆▍ ▆▇▉▋▌ ▄▅▇█▄ ▄▍▅▇█▋▄▌▌ ▋▊▇▅▉'▋ ▋▅▄▄█▉ ▄█ ▍▋▌▆▋ ▄▅█▋ ▇▊ ▋▉█▄▌▇▍▉▄█▆▍▆.
▄▄▅▌▅: ▆▄▉ ▄█▆▊ ▊█▇▌▊ ▇▌▍ █▌▅▆▅▆▊ ▉▍▍▍▊▋▉ ▆▊▍▆▇█▇▅ ▋▄▆█ ▆▌▉▋▇▅ ▇▍▋ ▅▌▍▋▌▊▉▊
▉▌▇▅█▆: ▉▄▄▇▆▆ ▊▍▋▋▅▍█▍█ ▄▄▆▌ ▍▋▊▊▋ ▊▇▉ ▉▆▇▉█▍▉▄.▇▇▆▍▅▇▅▍▊█▋▅ ▅██ ▌▄▆▉▉▌▇▇.▊▌▋▄▊▇▅▋▍▍▍▅▋
- ▋▇▋▊ ▊▋ ▍▆ ▌▆█ ▅▋██▅█▄ ▅▍▍▊ ▄ ▇▆█▉█ ▋▌ ▅▅▇▋▅▋▉
▍▌▄█▅ ▋▊▇▍ ▍▌ ▊▉▉ ▌▋▅▌▄▆█ ▇▅▆██▄▅▆▌▄▇▋▊ ▉▅ ▅▉ ▌▌█▄▆▉ - ▊▌▅▆▆ █▅ ▌▅█▅
▉▋▌▄▊: ▋█▅ ▅▌▉ ▍▍▍ ▋▊▊▄ ▆▌▇▄▉
▋█▌▍▋: ▅▋█▆▋▆ ▉▇▅▆▇ ▌▊▄▅███▄.▇▇▌▇█▊ ▅█▉▆ ▄▋▅▆ █▄█▅▋▊▄▌▆▍ █▋▋▄▅▄█▇▄▌▉ █▆ █▍▉▊▋▄▅▅▉▆▊▆ ▄▊▇ ▊▌▍█▄▍▍▋▌▄▆█▋
- ▊▋▇▊▄▋▄▅▅ ▍ ▆ ▌▄▋▍ █▄▋▅█▅▊ ▅▌ ▄▇▇█▆▋▉▉ ▊▇█▌▍▍▆▆
▉▅▉▍▋'▊ ▍▅▄▇▌ ▇▄▄ ▊▄▉ █▊▊█ ▊▍█▇▊, ▅▊▇ ▄▉▅▉▌▌ ▄▅▆▅ ▇▇▅█▍ ▌▆█ ▊▋▇▆█▇▉ ▌▍▅▄▉▄█▇
▋▍▋▋▋: ▆▅▉ ▍▇▇ ▆▇▆ ▅▄▉▅ ▅▉▌▍
Merge: from parallel_validatemove/stable_playercache
Promoting stable player cache version as main dev direction
Tests: none, no conflicts
Bugfix: fix transform cache rebuild loop
Previously threw away dirty indices too early, missing on some player cache changes
Tests: played back the staging demo - no more error logs about transfomr cache inconsistency
Clean: fixing broken whitespaces that I spotted with the merge
Tests: none, trivial change
Merge: from main
Tests: none, no conflicts
Bugfix: PlayerCache now tracks players that are removed from the server
Original impl left a space where it could miss some of the players, leading to rogue nulls.
Tests: played back staging demo - had same numbers
Bugfix: one of validation checks was doing nothing
Tests: none, trivial change
Clean: removing BasePlayer OnDisable/-Destroy logs for UsePlayerUpdateJobs
Got confirmation that it's not Unity nuking the objects, so something else must be afoot.
Tests: built server locally
Merge: from main
Tests: none, no conflicts
Clean: fixing broken formatting that snuck in on main
Tests: none, trivial changes
Merge: from main
Tests: none, no conflicts
Debug: adding sanity debug error logs to baseplayer OnDisable and OnDestroy
Hoping to catch where it's coming from
Tests: local build tests
Bugfix: ServerDemoPlayer - handle player reconnecting multiple times
Not 100% sure it's the correct way, but I think it works for now.
Tests: played back new staging demo 3 times
Tests: replace Assert.AreEqual with Assert.IsTrue
- Brings TickIntrpolatorCache test from 30s+ down to 6s
Turns out AreEqual is slow and inflates the test times by quite a bit.
Tests: ran unit test
Optim: TickInterpolatorCache reduce number of segments being copied when growing
Unit test is still slow, need to dig a bit more
Tests: ran unit tests
Clean: fixing whitespace issues after auto-merge
Tests: none, trivial changes
Merge: from main
Tests: none, no conflicts
Debug: sprinkling additional validation checks in ServerUpdateParallel
Trying to narrow down at which point this null sneaks in
Tests: none, trivial change
New: TickInterpolatorCache - a sparse, bulk TickInterpolator array
- Comes with it's own stress tests (they pass, but need to investigate perf)
- Depends on PlayerCache, but I need to modify it to provide more stability
Building block towards jobifying tick history processing.
Tests: ran unit tests
Optim: replace couple managed loops with a burst job
Tests: none, trivial changes
Buildfix: move ValidateTransformCache to SERVER region
- also fixed missing Profiler.EndSample()
Tests: built client and server in editor