1,480 Commits over 396 Days - 0.16cph!
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
Merge: from benchmarking_update
- Log results after single scene run
- Fix extra timers in results
- Fix scene load exception for no longer existing effects benchmark
Tests: ran benchmarks in editor
Update: different approach to skipping persistent BenchmarkTimers
Old way didn't work because of pauses between benchmark runs (global systems would step and recreate them).
Tests: ran in editor, confirmed output didn't contain specific timers
Update: log results when running benchmarks in single scene mode
Tests: checked logs after running the scene
Clean: remove EFfectsBenchmark from the list
I've removed it in the past, but apparantly forgot to remove it from this list as well
Tests: none, trivial change
Update: BaseRaidBench - clean up custom timers from tracking
Otherwise they end up in results with their generic names
Tests: none, trivial change
Merge: from camerarenderer_leak
- Fixes memory leaks related to Rust+'s camera renderer and Nexus mugshot savings
Tests: print_arraypool when connected to turret - before ProtocolParser 16KB set would grow, now stays constant
Bugfix: properly recycle mugshot data pooled array on nexus servers
Tests: none, same type of change as previous
Bugfix: properly recycle pooled array for camerarenderer
Tests: connected to a turret, printed array pool - before ProtocolParser 16KB pool would grow, now stays constant
Update: rewrite print_arraypool to support multiple array pool output
- also added logic to take into account T size
Useful to validate we're not leeking across pools
Tests: used in editor, both text and json options
Merge: from benchmarking_update
- Cleanup of obsolete EffectsBenchmark
- Editor-only DemoBuildingsViewer supports user modification of scene, scene export and import into scene
- Bugfix for infinite load loop in benchmarking flow
Tests: used the DemoBuildingsViewer to modify and export couple bases, built standalone client to run BaseRaidBench
Bugfix: fix infinite loading loop when running benchmarks
Caused by us hiding the loading screen and then loading monument scenes, which would leave them in limbo
Tests: ran the benchmark flow in editor and standalone client
Clean: DemoBuildingsViewer - complete remaining TODOs
- moved all InvalidBuildingId to Benchmark.Building
- consolidated some of Benchmark.Building's initialization logic
- fixed wrong comment
Tests: compiles in editor
Update: DemoBuildingsViewer - support exporting user placed building blocks
Requires them to have the BuildingBlockMetadata component
Tests: exported base with an extra wall, checked json - had expected values
Update: DemoBuildingsViewer - import handles domain reload events to avoid duplication
Tests: loaded a base from demo, triggered domain reload, deleted a wall, reimported - only wall came back
Update: DemoBuildingsViewer - can now export scene
- BuildingBlockMetadata now caches ParentEntityId and PrefabId
This enables the workflow of manually modifying bases in editor before export
Tests: diffed the Export merged and Export scene outputs (mostly the same, different sorting and slightly differeing floats by tiny epsilon), imported base from export scene - it's the same
Update: DemoBuildingsViewer - annotate spawned building blocks with metadata
- Also fixed building marker deduplication only spawning 1 marker
Allows to implement export of a scene (with manual edits), rather than demo protobuf.
Tests: used the tool, gizmos confirmed link up with building markers
Bugfix: DemoBuildingsViewer - don't spawn extra building markers on import
Tests: used the tool
Update: DemoBuildingsViewer - add debug toggle to spawn from source protobuf
Helps validating that everything is spawning correctly
Tests: used the tool in editor
Update: DemoBuildingsViewer - use processed protobufs, instead of raw demo protobufs, for scene spawning
- Benchmark.Building no longer caches raw protobufs
This standardizes logic between benchmarks and the viewer tool.
Tests: opened a couple bases from a demo
Update: DemoBuildingsViewer - can now recreate entities that have been deleted
Tests: spawned a base, deleted a bunch of walls, reimported - all back to normal