1,870 Commits over 457 Days - 0.17cph!
Merge: from analytics_queue_rewrite
- Bugfix for missing session-start event from Client, invalid session-end event from Client, malformed json aggregation
- Added support to edit upload intervals (tied to existing same server vars)
- Adjusted uploaders for some tables to avoid trying to send to our backend
Tests: unit tests + manual testing on Craggy (S+C mode) and Bootstrap (C only)
▊▊▉▇▋▇: ▅▅▅▆▅█▊▌▉▊▉ - ▆▉▍▅▄▋ ▍█▆▇ ▆▉▉▋▄▊▇ ▆▊▉█ ▍▌▇▍▄▊▅▍▊▆▄▆▌▉▉▆▄ ▉▍▊▍
▉▄▌▊ ▊▉▅▌▇▊ ▌▄▅ ▇▋▉▆▄▅-▋▉▊▅▆▆▊▅▉ █▆▊▋▍▉▇▋▉ ▆▇ ▄▍-▅▇▊ ▅▅▋ ▆▋▊▌█▌ ▌▇▌▍▉▇▍ ▇▊▇ ▄▍▄▅ ▊▍▍▄▍▊▄▋ ▇▇ █▄▅▌▍▋▌
█▆▌▄▅: ▉▌▍▍▇▋▇ ▋▆▋▄ ▄▅▇▌▉▌, ▋▌▄▄▉██▆▄ █▍▉▊ ▊▆▄▉█▄▄ ▄▇▆ █▉▄▋▄▄▋▊/▍▆▉█▄▍▄▍██▋
Update(editor): AnalyticsV2 - emit session start event
This is to make validating analytics on the backend easier (as this helps to form a full session)
Tests: with logging enabled observed session-start being fired before player_connect for server is sent
Update: AnalyticsV2 - add support for changing upload intervals
- made RuntimeProfiler and TickLogger adjust their intervals
Tests: enabled runtime profiler and changed interval - confirmed sent when expected
Update: AnalyticsV2 - restore gameplay_events upload interval
Accidentally submitted while testing it yesterday
Tests: none, trivial change
Bugfix: AnalyticsV2 - don't spam "appended 0 bytes" when logging is enabled
Tests: none, trivial change
Bugfix: AnalyticsV2 - ensure events sent at shutdown have valid steam tickets
Done by pumping steam event queue while analytics thread is shutting down
Tests: unit tests and ran Client mode in editor
Bugfix: AnalyticsV2 - only recycle auth tickets if not consumed them
- Added extra checks for early steam shutdowns
Previously we would eagerly cancel tickets, which is not api-appropriate. Now only doing so if either an exception occured or we're in dry-run mode
Tests: ran unit tests. Still can't catch why auth ticket is sometimes null on shutdown
Bugfix: AnalyticsV2 - fix invalid Json aggregation
- logs are aggregated again to reduce spam
This breaks azure bulk aggregation, but now the code structure is in place to support both
Tests: ran unit tests
Bugfix: AnalyticsV2 - don't miss client-only initialization during bootstrap flow
Tests: monitored client bootstrap analytics
Bugfix: AnalyticsV2 - skip client analytics if steam hasn't been started
Tests: none, trivial change
Bugfix: AnalyticsV2 - Log and DryRun no longer skip accumulators and uploaders once changed
As an extra, it got rid of a bunch of inheritance code
Tests: ran unit tests and logged analytics in editor
Update: UsePlayerTasks - ensure SendEntitySnapshotsWithChildren_AsyncState have equally sized batches
Previously we counter players for batch limit (skipping it's hierarchy), but that could lead to lopsided unequal tasks
Tests: couldn't test this one, but it's similar code to other places so should be gud
Optim: UseOcclusionV2 - ServerOcclusion caches unoccluded connections
- removed couple redundant if checks
This allows us to completelly skip faster-but-still-slow ShouldNetworkTo that have internal hash lookups in SendNetworkPositions - hoping it'll speed it up 50%
Tests: ran in and out of occlusion on Craggy. disconnected to validate sleeper, then killed sleeper and reconnected - all works
Merge: from analytics_save
- Adds a "save" event tracking when server creates a save
Tests: triggered save in editor with logging
Update: add analytics save event
Tests: ran an explicit save in editor
Update: add extra TODO for UseOcclusionV2
Tests: none, trivial change
Update: UseOcclusionV2 - propagate networkTime to OcclusionGetRecentlySeen
Should be a smidge faster, but it's primarily to enable threading if we go that way. Also saves on profiler inhibiting the call (need to exclude it on the profiler side)
Tests: none, trivial change
Clean: restructure UseOcclusionV2 code to make profiling easier
Tests: compiles in editor
Clean: fix ShouldSkipServerOcclusSion typo
English is hard
Tests: editor compiles
Optim: UseOcclusionV2 - OcclusionFrameCache uses NetIDs instead of BasePlayer pairs
This avoids ObjectEqualityComparer which has overhead because of unity-null checks
Tests: none, trivial change
Optim: UseOcclusionV2 - reduce lastPlayerVisibility hash lookups
Should help OcclusionGatherLostPairsToSend internal loop to stay hot. Also gets rid of small funcs that are inhibited by profiler
Tests: ran in and out of occlusion
Clean: add a comment explaining the extra OcclusionUpdateLostVisibility
Tests: none, trivial change
Optim: UseOcclusionV2 - invert how we process occludees
- instead of checking if we need to send player to occludees, we process occludees against player
This caused us to miss sleepers previously, which we corrected with extra checks by reversing pairs(and potentially generating more netowrk messages). But we don't need to do all of that extra work if we do it in the right order. Hoping this cuts downstream queue 2x.
Tests: 2p on craggy - checked occlusion works, going invis works, spectating works, sleepers replicate
Clean: introduce BasePlayer.UseOcclusionV2 use it as a switch instead of UsePlayerTasks (works same way)
Makes it easier to track what's related to what
Tests: editor compiles
Optim: ServerOcclusion - use network IDs instead of BasePlayer for dictionary key
Helps avoid unity-null check overhead when looking up recently seen players
Tests: 2p session on craggy - disconnected as second and killed sleeper
Bugfix: ServerOcclusion - remove destroyed players from lastPlayerVisibility cache
We were leaking baseplayers and it was slowing down hash lookups
Tests: 2p session on craggy, 2nd player disconnected, killed their sleeper - lastPlayerVisibility was empty for the remaining player
Update: UsePlayerTasks - lifting skipping logic out of OcclusionLineOfSight to caller
- left a couple more TODOs as I found a weirdness in the original code
Only thing left in OcclusionLineOfSight is grid-cell caching and deduplication.
Tests: none, discovered unit tests are broken since I upgraded occlusion cache version a month ago. Will fix and test later
Optim: UsePlayerTasks - ServerOcclusion uses CustomShouldNetworkTo and CustomShouldSkipServerOcclusion
Microoptim - this reduces hashset look ups and moves some checks to be run earlier. Main benefit is lifting more code out of BasePlayer.OcclusionLineOfSight
Tests: none, skipping tests for now
Update: refactor ServerUpdateOcclusionParallel to allow for experimental changes
Tests: compiles in editor
Update: add a bunch of optimization TODO notes for UsePlayerUpdateJobs 2
Gathered from inspecting 330p server snapshot from a late-in-the-patch-cycle server. Will clean-up before merge.
Tests: none, trivial merge
Buildfix: add missing CLIENT guards
Tests: build all configs locally
Merge: from analytics_queue_rewrite
- New analytics uploading backend, disabled by default (analytics.usev2)
- New debug vars - analytics.log and analytics.dryrun
Tests: unit tests, used both old and new analytics backends and monitored logs
Merge: from baseplayer_vis_nre
- Simplified how debug.invis works
- Reimplemented how global.spectate and spectateid work - spectator no longer parents to the spectated player
- Tightened existing debug logs around mystery baseplayer NRE.
This eliminates a source of potential NREs related to players spectating others, but doesn't outright forbid them
Tests: 2p sesions on Craggy, one player spectates other - killed scientist with AK(hs audio replicated), helicopter fly around, motorbike ride around, noclipped outside of usual network range and back, cycled invis, left the server and returned - no issues. Tried debug camera.
▉▋▆▅▆▇: ▊▊▇▌▄▍▋ ▊▇▄▍▋▇▄▄▆▇ ▍▊▍ ▍▅▄▍ ▍▄▇▌▇▌▇▋█▄▉ ▍▇▆▋ ▍▋▅█▋▋▋▇▊▊▆ █▇ █▇▇▉▊ ▇▍▄-▉▌▇█▊ ▅▆▆█▅▌▄
▅▋▅▋▊: ▆▅▆▊▊▆▅▇▄ ▇▅▋▍▇▍ ▇▊▇▍▌ ▍▅▊█ ▅▅▉▇ █▆▋▅▉▍▇▆, ▋▇▍▉▆ ▅▊▌▄, ▉▉▋▍▋██, ▆▍▊▅█▋▉▉▊▋, ▍▌▉▄▅▄▍▋ - ▊▇ ▇▇▊▌█ ▌█▉▊▌█▊▋ ▆▌ ▊▆▆ ▋▍▌█▍█▅▌▆'▍ ██▋, ▅▅ ▅▄▌▆ ▋▊ ▊▆▍▌
Update: Add a safety guard to DestroyOnClient to avoid destroying client's local player
Tests: 2p session on craggy (though there's no case in vanilla where this can happen)
Optim: pool SpectatorSubStrategy and SpectatedSubStrategy
Tests: 2p session on craggy with disconnects - checked pool.print_memory afterwards
Update: convert IsBeingSpectated utility
- Updated dependent code to use new GetSpectators instead of old nested children approach
Tests: spectated player on craggy that shot scientists - headshot sounds replicated correctly to the spectator
Clean: remove BaseEntity spectating support and fix up types/names of relevant code
This code was broken for multiple years, and couldn't think of a reason it could be useful, so simplifying.
Tests: spectated on craggy, cycled view modes
Update: when spectated player disconnects, switch spectators to a new target
- this also fixes a leak of spectated players list, since it gets cleared by above action
Tests: flew out, disconnected - spectator returned to self. Reconnected, started spectating joined player - all replicated.
Update: reimplement spectating to use ISubscriptionStrategy instead of secondary groups
- Done via SpectatorSubStrategy (takes subscriptions of target) and SpectatedSubStrategy (notifies when group changes)
- Removed old secondary group code and reverted relevant Network API changes
- Made Networkable.OnSubscriptionChange public
This also fixes the bug with previous version that it only saw "near" distance entities
Tests: Spectated player on craggy, flew around until island disappeared from rendering - no NREs. Got 2 things to improve, and I think it's done
Update: extract how we gather network group subscribers into a ISubscriberStrategy
- implemented a DefaultSubscriberStrategy
This CL doesn't have any logic change, it just reorganizes code so that we can start overwriting this(need it for spectating now and parallel processing in the future).
Tests: 2p on craggy - saw the island entities spawn in as well as the players replicate
Bugfix: spectators now subscribe to spectatees via secondary group
This prevents spectatee from being culled out by network grid onthe spectators end, leading to NREs. This is temporary solution, as it doesn't have the same network range as the primary group.
Tests: spectating a palyer on craggy, then flew around till the island was no longer visible
▋▇▅▋▍: ▅▍▌'▍ ▅▌▇ ▋▇ ▄▄█▉▅ ▌▍▌▇▌▅██▄▌▋▅▆▇▅▇▊▌▍▅▋█ █▆ ▌▄██▆▄▌▌▉▍
▅▌ ▌▍▆▊▉▊▍▍▆▍ ▊▄▊ ▍▇ ▆████▉ ▊▉▋▊▍▆▄▄ ▌▊ ▆▅▇█▋▉▇▉▄█, █▄ ▌██▌▆'▊ ▊▇▅▉ ▋▇▆█▉▍▉ █▍▍ ▇▇▇▌▇ ▉▊▊ ▅▌▇▍▄'▊ ▊▆▆▄▄▇▇ ▉▉▋█▄▆▆ ▄▇▍▊█ █▊█▅▉▉▋, ▍▍▆▆▅▋ ▆▊▋ ▆▋▉█▊ ▉▌▌▊
█▆▆█▊: ▌▌▋▉ ▉▍▆▅▊ ▉▆██▇▆▉ ▊▋ ▊ █▌ ▊█▅▌▌▌▊ █▅▆█ ▉▇▇██▆▋▊▉▄ - ▄▍▅▅'▅ █▊▅ ▌▉▊ ▍▋▅▇▉▊▊.
▋▋▋▇▄: █▄▌'▊ █▇▌ █▇ ▊▋▊▇ ▅▄▋▇▄▅▍▅▋▋▆▅█▊▉▅▊▉▅▊▋▊▌▍▄ ▊▄▋ ▋▆▌▉▊▊▉▋█▇ ▋▉█▍▊▇▉
▉ ▍▊▆▆▊ ▄▊▄▉ ▉▅▌ ▇█ ▅▆ ▇▉▍▋ ▉▋▅▋▊▇▌▉▅▌ ▍▉▇▉▊▇██▉▋ ▍▊▅▄▉▊▄ ▇█▅▉▅ ▇▌ ▄▆█▉▊▇▆▄▌▊ (▉▊ █▋▋ ▋▌ ▌▄▆▋▍ ▊▅▅▄ ▆▉ ▅▄▆▌▆▉██▍). ▍▌▆ ▉▍ ▋█ █▍▅▆▉▊ ▇▋▄▅▄▅ ▉▇▇▉▄▊▌▋▇▋ █▍ ▇▇▌▌▍▋▊▌▅▆, ▋▆ ▌▄▄ █▊▉▋▄ █▆▌▉▊▆ ▆▌▄▍.
▄▋▉▆▌: ▅▌█▋ ▇█▅▄▇ ▊▄▋▍▊█▅ ▌▍ ▇█▅▉▆▆▊ ▉▋▌▅ ▅▍▊▉ ▅▍▉▅ ▋█▉▇▅ - ▉▍ ▉▉▆▆▉▌▆▋▆▌ ▋▊▊▅▄. ▌▋▆ ▍▅▊█▅▋▊▌ ▄▄▉▋ ▅▍▍▆▋▅▆█▇ ▆▍▅█ ▋█▇▍▍▊▉▌▄ ▆█ ▇▄▇▉▉▋▌▅▆█ ▋▌▊ ▇█▍ ▊▆ ▍▊▆█▍█▇ ▇▌▄█▍ ▍▄▋▉▍▊ - ▋▋▌▊ █▌▍ ▄▍▊▊ ▊▉ ▋ ▍▉▄
Optim: cache spectated target
Turns out it's quieried very frequenly
Tests: 2p session on craggy with disconnects
Update: first version of spectate that doesn't require parenting to target player
Doing this to avoid weird bugs with nested players in other systems.
Tests: 2p session on craggy with spectating. Toggled camera modes and toggled invis. tried spectating after server occlusion culled other player. Noticed that nutrition, comfort info didn't replicate, map compas reacted to spectator's input - will fix those next