2024: The Year of Entities


This is a statement of commitment. ๐Ÿ™‚

After over 2 years of researching and experimenting what kind of products I could, should make in order to generate a viable, work-from-home income by the end of 2025 I am now committed to say:

Entities

And, in general, DOTS and Data-Oriented Design.

What exactly?

I’m not 100% sure yet. I know the space, and how to reason about it. I’m exploring soooo many ideas but what drives me the most is:

How can I make Entities more approachable?

Because the biggest issue remains the barrier of entry.

We all want to be having less issues while developing games. No exceptions EVER, how’s that sound? With Entities there aren’t any references to begin with, just data and code that transforms data.

We also wish to scale our game’s performance with the number of CPU cores – but what is actually achievable is to run code 10 to 100 times faster – PER CORE! That’s how fast Entities can go!

So, while Unity has some great ideas in their roadmap, DOTS in general takes a serious hardcore attitude that even seasoned developers lack – after all, some would not even care enough:

“Game Objects are fine! Why go through all this trouble?”

If that’s your line of thinking, you are the clown in the car:

Object-Oriented programming is not performant, period.

And then watch this to stop making excuses about how performance doesn’t matter:

Performance matters, everywhere, anytime!

This talk rang so many bells with me, as I myself have come to realize over the years how much slower everything has gotten.

Allow me to rant about my biggest performance pain point (feel free to skip this and scroll down to the next section):

2020’s slower than 1990’s!

Imagine trying to play music in the 90s vs what it is now.

Back in the day, you had a disc in your CD player – press the On switch, press the Play button, and within 2 seconds music is playing.

Fast forward three decades. Thirty years. Imagine most of us didn’t have a mobile phone in the 90s, now everyone has at least one “smart” device with a touchscreen that is an ENTIRE computer in your pocket more powerful than the desktop machine you played games on in the 90s!

I just assume you’re that old. ๐Ÿ˜‰

So to play music today, you would start by turning on the wireless speakers. Wait three seconds for them to “boot”. As the light goes on, switch them into Bluetooth mode via remote because they don’t have buttons and do not remember that Bluetooth is the thing I used last, or is generally the only thing I play music with.

Now open your smart thing’s Settings app, go to Bluetooth, and tap the speakers in the long list of devices that aren’t even yours nor nearby to connect the speakers because for whatever reason they don’t connect automatically.

Well, not quite. About one in twenty cases, they DO connect automatically just to remind you that this used to be the norm but it no longer works for totally obscure reasons you couldn’t figure out.

After a few seconds the speakers confirm the connection with a sound. In the meantime you can already open the Music app and wait for it to launch while hoping this won’t be one of the infrequent cases where bluetooth just won’t connect initially.

Of course you have to wait for the music app to load the welcome page – not necessarily the page you last used of course because, hey, there might be new music you’d be interested in, right?

So the app is taking its time gathering both information from the Internet and scanning your downloaded music library. Whatever user interface you see at this point – it’s a fake! It’s an image that does not respond to your input AT ALL.

Except .. when it does .. somehow, sometimes it queues up a touch that the app picked up and you end up anywhere, just not where you expected to be when the app does get responsive.

Then you scroll through your numerous lists of music or artists.

Definitely not a smooth scroll, no! Every once in a while scrolling slows down or stops altogether because it needs to load and show all these thumbnail images. You just never know how many times and how fast you have to swipe to get precisely where you want to go because loading this data depends on the Internet connection, background processes, moon phases and your horoscope.

Then you finally open the playlist and press Play. Now you may or may not have to wait for the app to buffer the music from the Internet but it definitely needs to get buffered on the speakers.

Depending on the quality of your speakers, this may result in instantly starting to play the heartwarming song intro “Blaa..” as it STOPS within a second because it decided it needs to buffer more data before the music goes on with “..aaahhaaaaalalala” completely destroying the experience of this fantastic intro.

I’m fortunate (!) if I get to hear music in under 20 seconds these days, starting from the moment I intend to hear music – that’s a TENFOLD (!!) decrease in performance compared to what it used to be 30 years ago!

Sure, we now have wireless technology but once set up, cables aren’t going to suddenly drop the connection, or lower the bitrate so you actually hear the compression kicking in.

Absolutely, we can now stream any music at any time! Except .. this only helps exploring. Most of the time I want to hear very specific music. It’s the same playlist or artist almost every time!

I should probably get a CD player on eBay and hook it up to the “Line In” on the speakers via classic cinch cables.

However: getting the music onto a CD with no way to legally download any music in a DRM free format and without a CD burner is going to be an issue. Oh well.

Long story short … I love when things perform! Finally here’s:

My Ideas for Entities

Lengthy rant-story aside, here are some of the ideas I’m exploring:

  • Think: “Playmaker for Entities” – Statemachines are a natural fit for an Entity Component System. I’ve designed, programmed and worked with FSMs for a decade. And I’m – quite frankly – apalled by the code quality of these tools.
  • Building Block-Jobs: so many things can be made reusable in an ECS – except most developers don’t think this way. Need to spawn entities randomly around you in a circle? That’s 3 or 4 reusable jobs and components, not a bloated component and a single job that jumps around in memory and branches a lot!
  • Graph Editor – combine both of the above concepts, you get the idea … or not, some dislike “visual scripting” tools – and for good reason, therefore:
  • An underlying DSL that the graph simply visualizes – imagine getting the best of both worlds interchangeable in a source-control friendly text file format. And a C# API of course.
  • Optimized code generation – writing Entities code is verbose, repetitive but it lends itself to automization. Tick a checkbox to test if your code works faster with more structural changes over many sparse archetypes. Or allow the system to generate the components so you needn’t think about how to best lay out the data for optimal CPU cache usage.
  • Did I mention Code generation? Like even when you write Entities code in C# the Roslyn code generator can lift some heavy weights for you, or just make it easier to work with.
  • Streaming worlds – Entities are a natural fit for this. Extend this with random seeded generative content and you can save a lot of design and load time.
  • … and more.

This is more than enough for a single person to stay busy for years. Some may even think it’s not feasible to think this big.

But I enjoy decomposing things into bite-sized chunks, reason about data, optimize by measuring various approaches to the same problem.

Of all the things I have done as a game design and programming employee I was already leaning naturally towards data-oriented designs. In the past ten years though, with one exception, I sort of lost track, struggling with OOP architectural issues and falling into various OOP design traps.

I tried Clean Code but the way I see it, it’s best understood as simple, readable code specifically for the user-facing API and unit testing everything that’s internal. Data-oriented design is a natural fit for unit testing by the way – you provide input data, run the system, and check if the output data is as expected. You could even assert tests simply by doing a memcmp against the expected result.

I also have several utility packages I created over the past two years that I’m putting on the store (and on GitHub) in the meantime, some of which will help to speed up development.

In any case, I can plan big yet start simple – progressively, iteratively building tools and systems that work well together.

The first task for me is to actually gather more development experience by implementing a 100% Entities game in the building-block style that I have in mind.

I call it:

“Entity Survivors”

Of all the games in the past years, no other game has hooked me as much as Yet Another Zombie Survivors:

I want Entity Survivors to be like that, definitely in 3D, but a lot more mayhem!

  • Every Entity shall be decomposable into limbs and pieces.
  • Every explosion generates shockwaves and shrapnel.
  • Every bullet is traced and generates impact splatters.
  • The world isn’t artificially bounded to a (small) rectangle.

While at its core its a very simple game mechanic:

  • Walk around
  • Spawn enemies
  • Move enemies straight towards player
  • Automatically fire at the closest enemy
  • Hurt and kill whoever gets hit by whatever
  • Relax and enjoy

No AI or pathfinding, no complex interactions. It doesn’t even need physics for collision detection.

Yet it does provide the opportunity to create systems that many games across genres need (not just RPGs): Character and Weapon Stats, Skills and Attributes, Inventory and Equipment.

Actually, I’ve already started a character controller for this a few months ago, albeit in OOP style:

Animated Survivors Team Character Controller

Final Words

I’m sorry this post went on for this long. I tend to write a lot. ๐Ÿ™‚

I honestly really only wanted to post a committment to keep me focused, to kick off the marketing and hopefully planting seeds of interest in you, dear reader.

If this did work for you, please sign up for my email newsletter:

I shall also rekindle posting content more frequently to my Youtube channel – you may want to subscribe there as well.

Final side story: I’m also doing this for my budgies.

One of them laid their very first egg yesterday – unfortunately not in the nesting box, so it dropped, cracked, and got cannibalized. I just found the empty shell. I’m sure they’ll get it right the next time.

Bathing Budgies

Exciting times! ๐Ÿ™‚

And let me know your thoughts down below:

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

WordPress Cookie Plugin by Real Cookie Banner