1,924 Commits over 457 Days - 0.18cph!
    
    
    
        
            
            
            
                
                Update: review fixes #1
- fix formatting in BasePlayer-Mission
- Apply same mission fix from vanilla server flow
- Comments around EventRecord.New and AzureAnalytics.OnPlayerTick warning to avoid scripting API to keep it thread save
Got 2 more changes to make, then think it's ready
Tests: compiles in editor
                
                
                
                
             
         
        
            
            
            
                
                Update: make batching constants servervars
- New vars are Server.SnapshotTaskBatchCount and Server.DestroyTaskBatchCount
- factored out SendEntityDestroyMessages
Tests: none, trivial changes
                
                
                
                
             
         
        
            
            
            
                
                Bugfix: recycle filter buffers when there's no results
UsePlayerUpdateJobs 2 only issue
Tests: none, trivial change
                
                
                
                
             
         
        
            
            
            
                
                Update: ran Generate Code
Tests: none, trivial change
                
                
                
                
             
         
        
            
            
            
                
                Update: Network++
UsePlayerUpdateJobs 2 can send packets out of order, which needs client-side change (see CL 128169)
Tests: none, trivial change
                
                
                
                
             
         
        
            
            
            
                
                Update: amending a comment for SendDemoTransientEntity
Finished investigating, server-demos shouldn't be a problem for multithreaded networking
Tests: none, trivial change
                
                
                
                
             
         
        
        
            
            
            
                
                Bugfix: players go back to sleep on disconnect on a server with UsePlayerUpdateJobs 2
This looked scarrier than it ended up being. One concern left to investigate - looks like I'llbe able to merge it in tomorrow
Tests: 2p session on craggy with UsePlayerUpdateJobs 2
                
                
                
                
             
         
        
            
            
            
                
                Optim: NetworkPositionTick - skip transform access
Tests: none, trivial change
                
                
                
                
             
         
        
            
            
            
                
                Optim: inline virtual calls in SendNetworkPositions and skip transform access
Tests: 2p seesion on Craggy with UsePlayerUpdateJobs 2
                
                
                
                
             
         
        
            
            
            
                
                Update: simplify SendNetworkPositions
Decided against parallelizing with tasks as it looks to be taking only ~0.3ms on a 350pop server
Tests: 2p session on Craggy with UsePlayerUpdateJobs 2
                
                
                
                
             
         
        
            
            
            
                
                Clean: fix formatting
Tests: none, trivial change
                
                
                
                
             
         
        
            
            
            
                
                Bugfix: fix failing WaterLevel tests
My ReadOnlySpan caused it, as we had hardcoded access to the global PlayerCache (which we don't use in tests).
Tests: unit tests pass
                
                
                
                
             
         
        
            
            
            
                
                Update: rename BasePlayer.playerCache member var -> BasePlayer.PlayerCache
It was hiding the source of a bug, as func params have lower case name
Tests: compiles in editor
                
                
                
                
             
         
        
            
            
            
                
                Clean: prefer ReadOnlySpan<BasePlayer> instead of playerCache where possible
Makes it easier to guess things at a glance.
Tests: ran all relevant unit tests(discovered WaterLevelTests are failing, will investigate next) + 2p session on craggy with UsePlayerUpdateJobs 2
                
                
                
                
             
         
        
            
            
            
                
                Update: demote PlayersToFinalize, PlayersToValidate, PlayersToRecache from being global caches
Tests: 2p session on Craggy with UsePlayerUpdateJobs 2
                
                
                
                
             
         
        
            
            
            
                
                Update: demote PositionChanges from being a global cache
Tests: 2p session on Craggy with UsePlayerUpdateJobs 2
                
                
                
                
             
         
        
            
            
            
                
                Merge: from occlusion_rework
- Fix for occlusion queries not being commutative
- Reenable occlusion frame cache and expand it's use to full frame
- Server occlusion deduplicates queries
- minor API restructure (might affect mods)
                
                
                
                
             
         
        
            
            
            
                
                Optim: ServerUpdateParallel - update player subscription groups just before we run sever occlusion update
This ensures that server occlusion frame cache is built from up-to-date occluders, and allows to save on more occlusion checks downstream in ConnectedPlayersUpdate
Tests: 2p session on Craggy with UsePlayerUpdateJobs 2
                
                
                
                
             
         
        
            
            
            
                
                Clean: split up FinalizeTickParallel monstrosity
This is end of prep to rearrange systems for better occlusion cache reuse
Tests: 2p session on craggy with UsePlayerUpdateJobs 1 and 2
                
                
                
                
             
         
        
            
            
            
                
                Update: add native list expand to GatherPlayersToUpdate
No effect in current case, but can prevent surprise exceptions in the future if reused
Tests: none, trivial change
                
                
                
                
             
         
        
            
            
            
                
                Clean: minor refactor of ServerUpdatePlayerTick
Getting ready to shuffle system steps around, to re-expand occlusion cache and potentially reduce network traffic
Tests: none, trivial changes
                
                
                
                
             
         
        
            
            
            
                
                Bugfix: avoid stale occlusion results for new occludeeds
Didn't realize UpdateSubscriptions modifies occludees - this returns a bunch of overhead. Will try to fix next.
Tests: none, trivial change
                
                
                
                
             
         
        
            
            
            
                
                Optim: deduplicate occlusion queries
Saves 15-50% in 1k baseplayer pairs parallel occlusion perf tests.
Tests: occlusion unit tests
                
                
                
                
             
         
        
            
            
            
                
                Clean: ServerOcclusionJobs.Algorithm uses int3 instead of SubGrid
Simplifies the code a bit
Tests: ran unit tests
                
                
                
                
             
         
        
            
            
            
                
                Clean: get rid of non-burst CalculatePathBetweenGrids
- Also removed obsolete tests
We've been using burst version for a bit, and with current fixes it balooned to too many lines of code
Tests: ran unit tests
                
                
                
                
             
         
        
            
            
            
                
                Bugfix: apply same neighbour occlusion fix to jobs
Perf tests of 100k paths show degradation (serial +25%, parallel +52%), but perf tests for 10k baseplayer occlusion show negligeble impact (serial -9%, parallel +1%).
Tests: occlusion unit tests pass
                
                
                
                
             
         
        
            
            
            
                
                Bugfix: reimplement occlusion neighbour logic in non-burst flow
- Added anothed optim todo now that we have axis-count-specific neighbour checks
This partially fixes the failing test (it still fails since now it trips up in burst version)
Tests: ran unit tests
                
                
                
                
             
         
        
            
            
            
                
                Update: Re-enable sorted pair occlusiuon visibility  caching
Tests: none, I know it's borked
                
                
                
                
             
         
        
            
            
            
                
                Merge: from baseplayer_serverupdateparallel
                
                
                
                
             
         
        
            
            
            
                
                Update: disable bidirectional occlusion caching for now
- Left a couple optim/safety todos
This fixes the batch vs serial baseplayer occlusion consistency test, but one CantSee fails as expected. Going to fix it in a child branch, as that currently blocks more optims.
Tests: ran relevant unit tests
                
                
                
                
             
         
        
            
            
            
                
                Tests: TestLineOfSight - properly enforce non-job mode in relevant cases
Tests: ran test sets
                
                
                
                
             
         
        
            
            
            
                
                Tests: TestLineOfSight - validate reverse paths
Looks like some occlusion checks might fail reverse paths. That's an uh-oh.
Tests: ran above set, got a failure
                
                
                
                
             
         
        
            
            
            
                
                Tests: ServerOcclusionTests - generated data set now contains similar pairs
Interestingly, this trips up consistency test - will investigate
Tests: ran TestOcclusionLineOfSight_Consistency
                
                
                
                
             
         
        
            
            
            
                
                Tests: PerfOcclusionLineOfSight - reset internal recent visibility cache between runs
Tests: ran the set
                
                
                
                
             
         
        
            
            
            
                
                Tests: ServerOcclusionTests - standardize test naming
Tests: ran test set
                
                
                
                
             
         
        
            
            
            
                
                Tests: ServerOcclusionTests.GeneratePairs - generate correct number of pairs
This further shrinks runtimes, as previously we generated waaaay too many
Tests: ran ServerOcclusionTests set
                
                
                
                
             
         
        
            
            
            
                
                Tests: optim TestOcclusionLineOfSight_PerfSerial/-Parallel
By properly constructing and caching base players - tests now take less than a second.
Tests: ran test set
                
                
                
                
             
         
        
            
            
            
                
                Tests: add TestOcclusionLineOfSight_PerfSerial/-Parallel
Both run for too long - likely due to how I create players for the tests. Will fix next
Tests: ran the new set
                
                
                
                
             
         
        
            
            
            
                
                Tests: TestOcclusionLineOfSight_Consistency - rset occlusion cache between serial and parallel runs
Tests: ran the test set
                
                
                
                
             
         
        
            
            
            
                
                Tests: add ServerOcclusionTests.TestOcclusionLineOfSight_Consistency
Compares results between serial and batched versions.
Tests: ran the new test set
                
                
                
                
             
         
        
            
            
            
                
                Update: prep BasePlayer.OcclusionLineOfSight (both serial and batched) for use in tests
Tests: none, trivial change
                
                
                
                
             
         
        
            
            
            
                
                Tests: rewrite ServerOcclusionTests to make ServerOcclusion usage clear
Is it ugly on some lines? Yes. But is it explicit and beautiful? Also yes.
Tests: ran the unit tests
                
                
                
                
             
         
        
            
            
            
                
                Clean: propagate network time from FinalizeTickParallel
Tests: none, trivial change
                
                
                
                
             
         
        
            
            
            
                
                Optim: NetworkPositionTick - remove extra InvalidateNetworkCache
Cache has been previously invalidated in FinalizeTickParallel, so no need to discard it again
Tests: none, trivial change
                
                
                
                
             
         
        
            
            
            
                
                Optim: OcclusionSendUpdates can now reuse occlusion results
- Got rid of old OcclusionLineOfSight that used to send updates internally, as there's no need for it now
Tests: 2p session on Craggy with UsePlayerUpdateJobs 2
                
                
                
                
             
         
        
            
            
            
                
                Clean: remove couple TODOs
- one was just completed
- another was overzealous
Tests: none, trivial changes
                
                
                
                
             
         
        
            
            
            
                
                Optim: SendNetworkPositions - reuse occlusion query results
Tests: 2p on Craggy with UsePlayerUpdateJobs 2
                
                
                
                
             
         
        
            
            
            
                
                Update: move ServerUpdateOcclusionParallel inside FinalizeTickParallel
- FinalizeTickParallel invalidates players network cache - with UsePlayerUpdateJobs 2 we can skip it later, but 1 is has double-invalidate
This increases the coverage of OcclusionFrameCache, allowing to simplify a bunch of code.
Tests: 2p on Craggy with UsePlayerUpdateJobs 0, 1, 2 and disconnects. 0p server with UsePlayerUpdateJobs 1, 2
                
                
                
                
             
         
        
            
            
            
                
                Merge: from connectedplayer_rewrite
Got far enough along in this direction and things seem to work