• We have updated our Community Code of Conduct. Please read through the new rules for the forum that are an integral part of Paradox Interactive’s User Agreement.

Stellaris Dev Diary #170 - Performance and other technical issues

Hello, my friends! This is Moah, Tech Lead of Stellaris typing. I can finally talk about what you’ve all been waiting for: How many new platypi will there be in Federations? After weeks of…

Well, apparently, I should be "more technical." But before we jump into the mysteries of the Stellaris code, I want to take the time to talk a little about the balance between adding new features, improving performance and stability – especially in terms of multiplayer and the dreaded out-of-syncs (dreaded at least by me).

The Delicate Balance
Stellaris, like most decently sized code bases, is like a complex game of Mikado or Jenga: every part is connected in some way to every other part. When you add a feature, you add more connections. If you’re careful, you add only a few, if you’re in a rush you add a bit too many. This generally leads to Unplanned Features (aka bugs). In addition, once we see them perform in the actual game, we tend to expand features in new, unexpected ways, leading to more Unplanned Features(tm).

Once we realize what is happening, we start being more careful. Maybe too careful. Checking too many things, too often, ensuring that this interaction that is supposed to never actually happen is actually not happening. Not now, not later. Not ever.

So you have removed the unplanned features, but the game is a bit, ah… too careful. Some would say slow.

So you remove some of these checks. You realize that you don’t need to loop around the galaxy, you can just loop around this one tiny planet. Then you go one step further, and think “well I can maybe do that check only every three weeks, and this calculation needed by all these checks, I could store it in here and reuse it until the next time it changes.”

So now the game isn’t so careful anymore, we’re back in unplanned feature territory. But if the caching (storing/reusing calculations) happens at different times on different machines, you get slightly different results (like asking a developer for something before and after they had coffee).

Slightly different results are what OOS thrives on! Clients and servers have 0.0001 cost difference, compounded over time, that corvette is bought on the server but not on the client.

So you remove your “smart” algorithm. You replace it with the correct algorithm. You lose half of what you gained in step 2 and reintroduce some bugs. Probably.
Rinse and repeat.

But enough about my morning routine! Let’s talk about…

Performance
Stellaris fans are like C++ programmers: performance is always on their mind. To be fair, it has also been on ours a lot lately. We know that it’s not all that it could be, especially in late game and with the bigger galaxies. With that in mind, we’ve taken time to improve performance in a bit more depth than we usually can. We looked at what was taking the most time, and as everyone knows that is…

G3Zg2ENmwufWgqUXGFjTEebkxlbQzYRGI0diuSOCrFfUcSl9Xn8EkYCyzAUtWAyCdVXt5biT3vv65T4n-EnA5YmHZXb_Gpp9ydvqh28lj_Oa7py3yU3MHETwURjuo1QD4sFZiZNB


Pops.

There are many reasons why pops consume a lot of time in Stellaris, but the main one is that by endgame we have SO MANY of them. SO So so so so many. And they do so much! Pops have to calculate how good they’d be at every job (they do so every 7 days). Then they have to fight every other pop on the planet to get the job they’re best at. They also have to check if they could have a specific ethic. If they could join a specific faction. How happy they are. How happy they could be. How happy they would be on that planet over there.
All these things trigger modifiers calculations. If you remember my last dev diary, you know that modifiers are the only thing more numerous than Pops in Stellaris. And they all depend on each other. Calculating them is like pulling on a thread and getting the whole sweater.


OK, but what did we actually do about it?
Well first, I’ll admit I may have been a bit pigheaded on the whole “we need to do the jobs distribution every day because we don’t know when new jobs are added.” We reexamined this assumption, and jobs distribution is now only done on demand. It was also rewritten to iterate over a lot fewer things.

We also noticed a few triggers going through every pop of an empire to check if one or more are enslaved, decadent, or other things that can be tested at the species level. So we made new triggers to test these things at the species levels. In the same spirit, we had events going through every ship to find a fleet, so we added triggers at the fleet level.

Second, We’ve also reworked the approach to checking if pops can change ethics (and also made it work again), or if they can join factions.

Finally, we’ve looked for (and found) opportunities to use more multi threading.

But enough talk! What’s the result? Well, if a picture is worth a thousand words, here’s the answer at 30000 words a second:


The video compares the performance of 2.5.1 “Shelley” to 2.6 “Verne'' when running a save game from the community, which can be found attached to this post, with over 20000 pops. It was recorded on my work computer (Intel Core7-7900X @ 3.30Ghz, 10 cores and 20 threads, and AMD R9 Fury). You won’t necessarily get the same results, the exact difference in performance will vary with your computer, and the exact situation in your own save games, of course. On average, we’ve found something between 15% and 30% improvement in late game situations.
This save is just ideal to showcase the impact of the pops improvement.

DYxcPB_pqZfHKxxtAj0sh_Y3nx7zXM4OMcUHTkgNsDK9csuQgEECkgc6jVmUEgWpoa6lD2e9kfYdssD61j2I57mhM0XcyT20wfu8fFIZbP-Usqnw2PShuEAD0_-n-ZTNFcH0NJR6


What is this average anyway? How do you know?
Well, we have synths playing the game all night, every night. In the morning, we check how far they were able to go. We also ask them how many errors they encountered, what their endgame looked like, whether they got any OOS and then put all of that in tables and graphs, with many colors. Then we wipe the synths, so they don’t ask pesky questions about souls and whatnot.

EwNw1Mhvr5FLcwYQYuZClsoMxr8qHs3nF3VPqExEcAJrWCvISTEc2fcl3fNLWzQlWKdxuDLAGHEagL9FXOrtio6XazmKpx_rsR7Ri58Ts2tFbq7OcWPdsIG_ayumIutkMGm2VnD_


In conclusion
Although we keep performance in mind and do our best to keep it reasonable, we’re happy we had a chance to take a deeper dive into the issue. Hopefully the changes will spark as much joy for you as it did for us, and we’re looking forward to your feedback!

Next week will feature another dev diary about the other thing you’ve all been waiting for… MORE PLATYPI!

PS: The save file we're using is from the community, one of the performance threads. We are however unsure where we originally got it from. So if you recognize it, or if it's yours please tell us so we can credit you properly.
 

Attachments

  • perf_massive.sav
    4 MB · Views: 289
Last edited:
  • 1Like
Reactions:
Thank God and the Worm, this is going to help so many people.

How will the AI be changed? Will we finally have an AI that isn't "PATHETIC/PATHETIC/PATHETIC" to you in the late game? I'd like the AI to actually pose a threat when the Crisis comes in. Glavius did this wonderously, and with you retaining him, I'm sort of optimistic about what to comes.
 
There is nothing else to discuss. The Literally Unplayable Bug is fixed. The patch is perfect in every imaginable way.

What is the "Literally Unplayable Bug"?
 
In a democracy, the popup menu for elections just refers to your leader by the default title ("President" usually) instead of your custom ruler title.
AND IT IS FIXED. See the "What could Paradox do to make you buy the next DLC?" thread.
 
Last edited:
Couldn't pops that are identical be grouped together somehow and be handled as one larger entity in many cases? Though I guess that would introduce a lot of overhead.
They could be, and I've been toying with the fact, but if the comparison/grouping would be long fast enough to be worth it.
We've also talked about approaching this more as a statistics model and not have pops as a single entity. It's a lot of gameplay changes, though. So I'd rather we find a way to make this work and let design decide what they want, rather than force choices on them for better performance.

Is there any plan to address the fact xenocompatibilty spawns infinite species, or the fact that the AI Gene mods so many templates into existence the colonization screen and species screen can become unstable?
There's plans, but they're not going to be in at release.
 
I think it has to happen.
As long as there's pops and jobs, they're going to bring the game to a standstill; it's just a matter of when.

Agreed. Either you take some form of statistical approach ... which MIGHT also help lessen MICRO as well as helping performance OR you come up with ways to prune significant number of POPs from analysis.

I'd be happier with managing MID & LATE game at a higher level than I do when I'm starting so we can keep the number of decision points consistent but the type of decisions made are different.
 
I'd like to make a complaint spefically about decadence, on console it is CLEARLY not working as i have had over 150 years to fight and haven't seen the awakened empires fleet power drop at all (it's literally over a million now) so i am informing you paradox interactive that this is a major issue please fix this
 
I'd like to make a complaint spefically about decadence, on console it is CLEARLY not working as i have had over 150 years to fight and haven't seen the awakened empires fleet power drop at all (it's literally over a million now) so i am informing you paradox interactive that this is a major issue please fix this
As a non console player for whom decadance is Working As Designed, let me tell you you're not missing out. The decadence mechanic is lame and makes AEs descend from mostly-pushovers to totally-pushovers, rapido.

You complain about decadance not working, but let me assure you that when it does work, it's worse for fun games.
 
well let me be the first to explain why its in there. , if they (example incoming) have a 500k+ fleet and there's literally nothing to stop em (let's face it the decadance only keeps the Aae in line for a short time) the AE literally isn't a character that should be let win , not saying it should be easy to bear but when thier fleets get utterly ridiculous like over 700-800k something needs to be done heck even limiting a AE potential MAX FLEET LIMIT would be better
 
Last edited:
Are there any plans to allow many events locked for Hiveminds/ Gestalt to affect them?

The Horizon Signal event doesn't work for Gestalts, even though I already did it as a Synth Ascended species and I simply got the "Intelligent" Trait. It should work for Hiveminds and Machine empires aswell.

The self-modification event does not work for Hiveminds, please enable it for them aswell when you settle a low-habitability planets. Regular empires should not be better at adapting than Hivemind empires, which only have Biological Ascension in the first place. Regular organic empires have so many more tools to create the perfect biological pops, Hivemind don't have anything like Xeno compatibility, can't get Horizon signal, can't get species self-modification... Its so sad playing Hivemind and knowing you are simply excluded from many fun events.

The Nivlac Event is possibel for Rogue Servitors and Driven Assimilators, but not for Hiveminds. Again, why is this the case? Hiveminds could also benefit from this event. I see no reason to exclude them.

In all of these instances, all you have to do is add a total of like 5-10 sentences of Text depending on what empire gets the event, that can't be more than 30 minutes of work.

Please add these events (and probably many others that are missing) for Gestalts. It makes sense that species modification doesn't work for Robots, but it absolutely should fire for Hiveminds with the same path and extra traits that regular empires can get from it.
 
There's plans, but they're not going to be in at release.

Seriously?

I mean I'm on 2.1.3 because of the AI issues - so Federations is a no-buy for me anyway until I'm convinced the AI was fixed as well but...
No, wait, actually this is the very same problem as before:

Why should I pay money for new features if Paradox isn't willing to fix the ones that are already in but broken?
 
Hey there,

and thanks for the efforts to fix the lategame-slowness - or at least streamlining it - got a question! Wouldnt it be useful to better utilize and balance out mulithreading? As my games always look like this:

Core1: bored at 15%
Core2: bored at 15%
Core3: chatting with Core2 at 40%
Core4: netflixing at 5%
Core5: watching with Core4 at 14%
Core6: bored at 10%
Core7: bored at 20%
Core8: fuuuuuu I am so busy around 95%, can someone help me????
Core9: ignoring Core8 and is bored at 20%
Core10: tinkering at 17%
Core11: looking at the stars at 10%
Core12: whistling at 19%
Core13: playing minesweeper at 9%
Core14: browsing twitter at 10%
Core15: bored at 19%
Core16: bored at 13%

I add an image of the typical Stellaris CPU load which reflects my question:
upload_2020-2-26_21-52-14.png


...and yes, I simplified it, I dont want anybody to tell me that I only have 8 cores and 16 logical processors ;)

Would be glad for an answer!
Cheers
Stefan
 
You could try researching how multi-threading actually works.

Wouldnt it be useful to better utilize and balance out mulithreading?

You can't. Only a complete re-design of the game with a greater view to dividing the main game loop up into more threads could achieve further gains than just spinning off threads you can in the current game. ie You need a Stellaris 2.

A main thread in any game is going to use considerably more of one core than other threads off-loaded to other cores.

Threads. Cannot. Be. Shared. Evenly. Across. All Cores.

...The main thread is a highway, on one core. Threads spun off to other cores are relief lanes. Not another highway...

Finally, we’ve looked for (and found) opportunities to use more multi threading.
 
Last edited:
You could try researching how multi-threading actually works.



You can't. Only a complete re-design of the game with a greater view to dividing the main game loop up into more threads could achieve further gains than just spinning off threads you can in the current game. ie You need a Stellaris 2.

Thanks for you reply! :)

And dont get me wrong, I am just trying to understand why its such a difference to other games. Its not always shared even but MUCH more balanced to the other cores. Like for example a snapshot of a running game of Assasins Creed Odyssey:

upload_2020-2-27_2-18-22.png


So as I am no programmer or developer and cannot evaluate whats the difference between programming styles and techniques, different engines that are used or languages used. Also its not clear to me how one can spread workload across cores, but some games seem to be able to and some not, so wouldnt it be worth to redesign if you have a game like Stellaris which is supposed to be running live for a long time, considering Paradox strategy of rather adding features and evolve games instead of launching new versions every year? And when you follow this startegy, then you should consider redesigning it to meet the needs instead of just removing checkpoints or protocolling entries.

Would be nice to have some more insight.

Cheers
Stefan