NPC's by their very existence are subroutines run on the servers which is why when the server performance is taxed the NPC's behaviour goes wonky as they are not given enough cpu cycles to perform their logic lookup trees and act accordingly.
True, the NPC logic is being run on the server side. Hm, I do wonder how much information is being send to the client. Theoretically, the server wouldnt have to constantly send the position of each NPC to the client, it would just have to send the initial actions of the NPC. Like for example if the NPC decides to go from A to B, then the server can just tell the client that and the client can execute that action on its own. If new action is send from the server then the client will adapt the behavior of the NPC accordingly. But both NPCs and players are actors they will run on the same logic, I am not sure if thats how it will work. It might indeed just send the position and other data of each NPC on each tick. Anyways, I digress...
I had forgotten that Gordon said of Feb 2019 client movement was client authoritative but I believe that has been changed a few versions ago (3.5).
Yeah, it definitely was already changed to server authoritative with the Upstream part of the Actor Networking Rework. On the official roadmap is says it was released with Alpha 3.6. I just checked again in my presentation, it seems I made a typo and wrongly wrote Alpha 3.5. Fixed.
No clue if it's in the game yet or not I do know it was at one point on the road map but it seems to have disappeared. I could be its slowly just being implemented with other features or it could be that it's still on the todo list. Either way, it will help with the network requirements in that not all things need 30 updates a second sent to every client
I am very certain that Serialized Variable Culling is already in the game. They said in the JumpPoint article it was released with Alpha 3.1. Serialized Variables was most likely released with Object Containers in 2017 already. But I am sure they kept adding functionality afterwards as well.
Yes, CSOCS and SSOCS are all about performance improvements by managing what objects are or will be needed shortly. CSOCS is the client-side of the performance improvement there were some sever side updates because the client is no longer keeping in sync the whole game world and needs more information when unserializing objects (mostly about the current state of said objects).
I still believe that there were more server side code changes than client side code changes for CSOCS. With Object Containers they were already able to stream Object Containers from drive into memory on the client. They mostly had to put most of the logic in place for the server to send the correct data and the client just merely had to receive it and handle it. Therefore, most of the ground work for the client for CSOCS was already done with Object Containers and the main work for CSOCS was happening on the server code.
Btw, we got a response from Chad McKinney (kinda at least, its still not very definitive in my eyes):
RSI’s Spectrum is our integrated community and player interaction service, including chat, forums, game integration, and Player Organization facilities. Player Organizations (“Org”...
robertsspaceindustries.com
It does sound like that thanks to the Entity Component Update Scheduler certain entity components can reduce their tick rate depending on set policies, like distance to players, visiblility and more. And both client and server will share the same tick rate.
However, he wasnt very clear yet how much of the game is determined by the server and how much the client is simulating alongside the server.
the reason why you have a differentiation between fixed place and dynamic placed entities is because of how much network bandwidth you have available. Let's take your example of a space station. It is correct the parent object to the station might be dynamic as it orbits the planet but all of the objects within the station do not have their coordinates relative to their absolute position within the system. Their location is fixed relative to the position of the parent and since they cannot be destroyed or modified in any way they are fixed and no longer need any updates by the server or client.
Let's take the below picture as an example. While the planet spins the hab location on the planet is fixed and immutable (cannot be changed) doesn't matter what we do to it or how many test pilots crash into it. Within the hab is thousands of objects from the grow beds to the microscope lights and screens. Each of these objects has a fixed place within their parent object but their current location or condition does not need to be updated by the server. In fact, if you look at any of the animations on the screens even though are typically not synched by the server and if you had two players in the same place and looked at the same screen they most likely will see the animation script playing at different points along its loop.
In fact, this gets to the fundamental differences between the client-side and the server-side. The client-side when approaching a moving station gets the current stations' absolute position from the server and any dynamic parent objects within that location so it can load them into memory. The server not only needs to load the same objects into memory but it needs to run update statements on all of the dynamic objects since they were last serialized like moving the station to the correct location updating all of the npc locations within the station based upon their schedules.
The only thing the server has to update the client on is the placement of dynamic objects within the client's sphere. The client already has most object relative positions like all of the objects within an 890Jump just not the parent current location and vector.
I agree that static objects do not have to be syncronized. Afterall, they dont change (any relevant) state, so there wouldnt need to be any communicate for anything.
However, we know that all assests (like each table) are wrapped in their own Object Container, no matter if it is static or dynamic. For base building and housing in the future, we need almost everything to be dynamic objects (e.g. for push and pull functionality). We know that each Object Container or entity has its own id, probably 64 bits in size. Therefore, they could just send the unique id of the Object Container plus the absolute/relative position and rotation to the client for each one. Thats shouldnt be a lot of data. 64bits*7= 448 bits per Object Container. Compared to the actual data being networked of the more complex entities, that should be nothing. I think it would be feasible to load each and every Object Container over the network.
I actually did a test to see how much network bandwidth the game actually requires and played the game solo for 90 minutes. Spawned at new babbage, ran around for a bit, then spawned a ship, flew to a few moons, did some deliveries and returned to tessler spaceport. Only at the initial loading screen the download jumped above 100kb/sec, at New Babbage and the Spaceport it stayed around 60-80kb/sec and on moons it was around 40kb/sec. I would like to see a similar test with some combat with multiple players and ships and see how that impacts the bandwidth.
I created another Spectrum post and asked about it. Someone commented that people were able to run the PU in offline mode and indeed large Object Containers like planets, spacestations and cities are being loaded, some other entities are not or very limited. So that probably confirms that you were indeed correct. A lot of object containers are not being streamed in from the server. I still suspect that that might change in the far future, like when planets start orbiting and pretty much every object and item has states.
So I recently had a discussion with someone and we were unsure if the server only needs to tell the client to load dynamic objects (entities) and not static objects (for example a spacestation), or...
robertsspaceindustries.com
Bind Culling purpose is to limit the number of network updates each client receives. If I am drinking water on Port Olisar and you are on Hurston engaging with the seedy underbelly. You do not need location updates and script start and stop updates about what I am doing as I do not need to know the NPC locations, bullet location updates of what you are doing. Prior to Bind Culling ever dynamic object update was shared with every player on the server. Now your client only gets updates on the objects within its sphere, which greatly reduces the amount of network bandwidth needed while slightly increasing the CPU cycles needed on the server.
Serialized Variable Culling is a big feature of CSOCS and SSOCS as its what allows them to load and unload objects and their child objects. Just like the hab example above let's say we leave the hab and fly back into space. While the Planet object will still reside in memory the Hab which is a child of the planet is no longer needed and all of the children objects within the hab are also no longer needed so they are culled. And because you where the last player in the area the server is also able to serialize any state changes and placement of any dynamic objects left in the hab like the penguin and save those off to the database.
So they are two different things that act on different parts of the game engine. Bind Network Culling reduces the updates sent to each player to what the player needs to know about based upon their sphere. Serialized Variable Culling is used in the unloading of objects in memory that are not being used at that moment in time.
Yep.
I am slightly confused, is that not how I explained the technologies in the presentation? Were the explanations not precise enough or are it easy to be misunderstood? Do some of the explanations need changes? Just making sure in case I misrepresented something :D