We have been busy making lots of improvements to the overall architecture and technology of the game
Since running Age of Ascent alpha play tests a few years ago, we have been busy making lots of improvements to the overall architecture and technology of the game. We have a great partnership with Microsoft and are continuing to invest in their Azure advanced technology suite for our browser-based game development.
We are using Azure so we can scale out and deal with any unanticipated demands from giving players full access to group, gather and explore in our ultra MMO, as well as managing epic battles such as a world record breaking attempt! Our flexible architecture allows us to spool up as many meshed containers as needed based on the number of players in-game concurrently, as well as organically growing with the player base.
We have rebuilt Age of Ascent from the ground up, using new technologies and developments in tech that did not exist when we first developed the game, including contributing back to improve their success – which means a faster, smoother and more exciting in-game experience.
Our Players Front End Portal to the Universe of Age of Ascent
One of our key changes has been moving the front-end WebGL engine to BabylonJS. We had previously used a library called ThreeJS, but found that BabylonJS has some powerful new features, better support and compile-time checking. Built on TypeScript and web standards, it helps us eliminate cross-platform complexity and allows us to focus on what is really important: creating amazing in-game experiences for our players, with no degradation of performance.
We have moved to off-screen rendering of the WebGL so that we have a UI HTML layer, which sits on top of a WebGL layer – with the 3D rendering being done in a separate thread, rather than all combined – so non-space DOM updates (such as global chat, trade, manufacturing, alliance management) don’t impact or slow down the 3D rendering.
.NET Core and ASP.NET Core
We are using .NET Core to deliver a self-contained optimised environment with ASP.NET Core’s webserver Kestrel to supply an ultra high-performance web framework, giving us the fastest web server in the world. Kestrel is the new cross-platform .NET web server and one of the outstanding improvements is sheer speed, which dramatically improves with each new release. The benefits we get include reduced costs and better utilisation of hardware, with more players in space per server. We are also seeing faster game-play and lower latency, providing even more player delight!
For the comms layer, we are using real-time comms for market graphs, chat and notifications through SignalR which is part of the ASP.Net Core suite. It means commanding your empire just got even better and more responsive!
We are also providing APIs for our player base to allow them to build their own services for themselves and other players – functionality that sits over what we create, allowing players to be more engaged. Players always come up with very cool things that we have not considered, (such as sending a text message when your space station gets attacked) and it is very important for us to given them access to interfaces to create this functionality.
Dynamically Scalable Back End Orchestration
On the back end, we use Azure Service Fabric to orchestrate and scale highly-available clusters. As players move into new areas of space, it spawns up Azure Container Instances, so we can spin out new regions of space, on demand. There is no point in having lots of servers running, looking after what is going on in a piece of space, if nobody is there.
As people travel, Service Fabric spools up areas of space and manages where everyone is in space compared to everyone else; when people leave that area of space, it spools them back down. These count as ‘mini servers’ but as they spool in and out, split up or join, we can then create the containers on the fly and tear them down, based on capacity at any given time.
Azure Container Instances
This creates a very dynamic server environment, with a set of containers looking after 3D space, and a separate set of containers looking after the APIs and HTML-based UI. As traffic ebbs and flows throughout the day/month, our costs will match the number of concurrent players. This allows for server optimisation and provides us with a lot more scalability, making it easy to package, deploy and manage scalable and reliable game servers, which is done within Azure Container Instances (ACI). It is also much more flexible than our old solution, as it is putting more emphasis on the prebuilt Azure infrastructure rather than trying to provision and manage a fleet of virtual machines.
For code management and organisation, we have moved all of our source control and issue tracking to GitHub (the largest code repository in the world). This also provides us with better contingency and disaster recovery.
Geographic Player Management
Azure Traffic Manager
As our player base grows around the world, we want to provide an optimised player experience wherever people are logging on. We can do this by managing game container pools across multiple Azure data-center regions, routing players to their nearest geographic region with Azure Traffic Manager based on latency. This functionality allows us to geographically ‘turn on’ servers at different times of the day to match player usage, meaning the bulk of the players will get the fastest response time as they are closest to the server hubs.
Quests and NPCs
Azure Machine Learning
AI has always been limited for NPCs but now we can really bring them to life. We are using Azure Machine Learning for fast scaled-out training. We can then bring the models it generates back into the game world for quests and NPC flying in space, as well as automated running of factions and space centers.
Instead of having to define how an NPC flies a ship, we can now train our NPCs on how players react when they encounter another ship, and the NPCs will learn and fly the ships as players do.
We will be using ML to make quests and NPCs much more interesting and responsive to player interactions, learning from them and evolving with emergent behaviour. We will be careful they don’t get too good!
While I have presented at server conferences, we are looking to blog a lot more frequently – so stay tuned for more details to come!