1,701 Commits over 427 Days - 0.17cph!
Update: Test.ServerOcclusion - update stale cases with new ones
This was much more painful than expected. Need to update the perf test next
Tests: ran the unit tests
Bugfix: replacing old occlusion cache to unblock unit tests
All expect-true tests are currently failing - need updating the query locations
Tests: ran the Server Occlusion tests
Update: batched OcclusionLineOfSight now handles sending updates internally (like serial)
- driven by OcclusionLineOfSightNoBroadcast - this thing we can test
Don't like this encapsulation, but it should prevent issues like missing foundPairs.
Tests: none, trivial change
Bugfix: player replication no longer stutters with UsePlayerUpdateJobs 2
Was iterating over wrong occlusion results - need to refactor to avoid future confusion
Tests: 2p session on Craggy with UsePlayerUpdateJobs 2
Bugfix: rewrite batched OcclusionLineOfSight to supports sleepers
Tests: 2p session on Craggy with UsePlayerUpdateJobs 2, disconnected multiple times - no more out-of-bounds exceptions
Update: BasePlayer.NetworkPositionTick now uses batched server occlusion
Tests: 2p session on Craggy with UsePlayerUpdateJobs 0 and 2. Saw a bug on disconnect, will fix next.
Update: moving occlusion notification logic to it's own utility func
Realized I'll need it for the task-enabled SendNetworkPositions
Tests: none, trivial change
Update: change OcclusionLineOfSight interface to use (int, int) instead if deconstructed pairs
- Also fixed invalid allocator use for a native list - TempJob was wastefull
In the middle of writing SendNetworkPositions, and realized previous interface could be error prone
Tests: none, trivial change
Update: starting work on batched BasePlayer.NetworkPositionTick
Doesn't do any batching/tasks yet, just preliminary clean of non-player logic. Goal is to batch underlying server occlusion
Tests: 2p session on craggy with UsePlayerUpdateJobs 2
Update: Refactor FinalizeTickParallel to isolate ApplyChanges logic
Should help with profiling, and sets up for batched BasePlayer.NetworkPositionTick
Tests: local 2 palyer session on craggy with UsePlayerUpdateJobs 1 and 2
Bugfix: ensure we update player eyes before we kick off various jobs
Previously this would cause cached state to have stale eye positions.
Tests: none, trivial change
Update: refactor ServerUpdateParallel to only contain high-level calls
This should improve profiling view by clearly delineating logic
Tests: 2p session on craggy with UsePlayerUpdateJobs 2
Clean: mark with comments when each player cache is last updated
Tests: none, trivial change
Update: remove CachedState.IsValid - it was misleading and unnecessary
Reimplemented logic that used to rely it to instead rely on nullable values
Tests: editor compiles
Update: move CachedStates growth to ServerUpdateParallel
- also using zeroed memory to have sensible defaults for users that haven't yet being processed
Makes it clearer that they are in sync with playerCache
Tests: none, trivial change
Merge: from main
Tests: editor compiles
▉▅▉▇▇: █▍▉▍ ▌▌▅▇▌▆▇▅▇▌▆_▄▉▊▉▅
- ▍▌▆▇▅▋: ▍▋▋▋▄▅▋▇▆▌█▅▌▉▉▉▍▅█ ▅ ▍█▍ ▆▍▉▄ ▆█▊▊▆▌▄▍█▊ ▅▅▅█▄
▉▇▊█▋: ▄▉▇▍▅ ▌▍▌█ ▌▉▋▉ ▅▉▍▉▅▆▆▌▉▅▍▌▍▇▋▍▌▉▉ ▉, ▋▄ ▊▄▋▉▇▌▅ ▉▊ ▅ ▇▉▍▌▅▍ ▅█ ▅▍█▇█▄▅▉
▍▌▌▅▍▊: ▉▄▌ █▅▇ ▋▇▉▊▋▋▋▌▍▆ █▅▄▇▍ ▊▄▇█ ▊▇▋█▄▇▄▅▊▅▅▉▋▍▋▆▍▄▇ ▄█▋ ▋▄▋▇▊▄▊
▊▌▍▉▄: █▄▍▍█ ▇▊▉▅▋▋▋ ▋▅▇▄ ▄▊▋▇▍▍▊▊▋▊▊▍▉▄▆▅▄▋█ ▊, ▆▍▉▄▇ ▍▊▍▆▍▊ █▋▉ ▉ ▆▆▆▅▉█, ▆▆▌ ▊▋▄ ▄█▊▋▍▋▊ ▌▄ ▄▋▍ ▄▆▊█
Optim: use cached pos to avoid transform access
Tests: none, trivial change
Update: UsePlayerUpdateJobs server var is now a mode, not a bool
- rolled in UsePlayerTasks
Will make it easier to test new modes in the future and avoid weird servervar dependency mess
Tests: compiles in editor
Bugfix: cache missing state player analytics when jobs are disabled
Tests: none, trivial change
Update: take world pos out of CacheState
This partially fixes cached state missing for players whos ticks weren't processed yet.
Tests: 2p local session on craggy
Merge: from main
Tests: none
Merge: from occlusion_rework
- UsePlayerTasks runs occlusion checks using batched burst jobs
- UsePlayerTasks - any visibility changes are processed using tasks distributed amongst worker threads
- UsePlayerUpdateJobs - more use of CachedState
Tests: a bunch of local 2 player sessions on Craggy
Update: move serial server occlusion update code to the relevant partial class file
- Use ReadOnly interface for lists to avoid read-write access violations
Tests: compiles in editor
Optim: avoid player's world transform querying and use cached pos instead
Hoping it'll help reduce the 50% self time of ServerUpdateParallel on 200pop server
Tests: none, trivial change
Optim: OcclusionCache store sorted pairs
- Don't store SubGrids in the cache, just their indices - saves a bit of mem
Allows to double the effective capacity of the cache
Tests: 2 player session in editor with occlusion behind the hill
Clean: Move all of the player server occlusion logic to it's own file
- Removed now resolved TODOs
Now that it has both task and serial modes of operation, it takes too much space in server partition file.
Tests: compiles in CLIENT+SERVER editor
Update: use ConcurrentDictionary for BasePlayer.lastPlayerVisibility
Trying the simplest approach first, lets see how it scales on release pop.
Tests: 2 player local session with occlusion culling de-/spawning player
Update: early out from running occlusion checks if no players to process
Tests: none, trivial change
Bugfix: use cached network time of one player to avoid worker thread calls to script api
Tests: none, one more to fix
Clean: wrap Task.Wait into a named lambda
This will make it appear in server snapshots
Tests: none, trivial change
Update: main thread now participates in occlusion task processing
Tests: none, as I need to adapt more code to make it friendly to running on workers
Update: work-in-progress task splitting for server's occlusion checks
Rewrote the high level code to be able to run PlayerFound/Lost in batches on worker threads - need to confirm if it's legal
Tests: none
Update: reimplement how occlusion treats overrides
- this is a reimplementation of
118512
Allows to further simplify OcclusionLineOfSight code - enables removal of OcclusionPlayerFound/Lost
Tests: on craggy with 2 players, ran behind the hill, disappeared, turned on occlusion override - player appeared
Update: plug in batched occlusion logic
- fix early-disposed container
Need to figure out how to factor out the OnPlayerFound/Lost, but getting close
Tests: 2p on craggy in editor - walked behind the mountain and disappeared
Update: plug in new batched server occlusion job
Tests: none, need to hook up the calling code
Update: extract algorithm from ServerOcclusionJobs.CalculatePathBetweenGridsJob
Tests: inspected asssembly
Update: batched OcclusionLineOfsight skeleton
Tests: none, not engaged yet
Update: refactor server occlusion job to take out grid definition
Prep for adding a batch version
Tests: on craggy in editor with 2 players, ran behind the hill and got despawned
Update: refactor occlusion loop to be friendly for batching
Need to simplify BasePlayer.OcclusionLineOfSight before I can start working on batched job
Tests: none, no functional changes for now
UPdate: move serverocclusion caching logic a level higher
Goal is to get rid of OcclusionPlayerFound/Lost in the query, so this is first baby step
Tests: none, trivial change
Update: Don't step players that have been kicked by antihack
Tests: none, trivial change
Bugfix: avoid scripting API when sending EventRecords from RunAnalyticsJob task
- EventRecord.New now can be created on worker threads
Tests: hacked code to enable analytics in editor, then ran around on craggy
Bugfix: avoid scripting API in EACServer.LogPlayerTick
- cache more of player state on main thread
Tests: hacked code to run EAC in editor and activated player tasks - no more exceptions
Update: add "Server.UsePlayerTasks" feature switch
- also submitting updated ResetStaticFields
Tests: turned it on and off in the editor and validated in profiler
Update: experimenting with offloading tick analytics for players to worker thread
In editor delays are pretty small, should win us 0.7ms on 200pop server, but tasks library is al-locating cosntantly - still investigating alternatives.
Tests: ran around in editor on craggy, checked profiler
Clean: dead variable
Tests: none, trivial change
Clean: fix code formatting
Tests: none, trivial change