⭐Best Practices
For Massive Interactive Live Events (MILEs)
Optimise for the worst case
Unintuitively, in the Morpheus stack we care far more about the realistic worst case scenario performance than we do the average.
Optimisations that improve the average case (or even worse, best case!) may look good during development, but really only hide the impact of the worst case we may see in practice. To that end:
We should keep our best and worst case performance as close as possible.
This gives us predictable behaviour and increases the confidence in our testing. For example:
Sending RPCs at fixed intervals even without payload
Sending junk chat messages to always run up to our chat rate limit
This does not mean we do not care about the average case, only that we prioritise the worst. For scenarios longer than a MILE, optimising the average case performance may help for cost saving reasons.
Player behaviour invariance
Game performance is primarily influenced by what players do in the game. The worst case performance is some function of all the different actions players can take in a game.
In order to understand the performance of our games, we need to know and test the worst case player behaviour (see above). This means making the best case and worst case performance due to players as close as possible. To achieve this:
Player behaviour must have as little impact on performance as possible.
This does not mean limiting players' actions or freedom in games; instead, it means that regardless of what players choose to do the system load is similar.
Examples of how we achieve this:
Every player in Morpheus sees the closest N players regardless of distance
Every client in Morpheus sends RPCs at 10Hz whether there is data to send or not
Be wary of metres
If you are thinking about designing a system which cares about how far away things are, especially players, it likely isn't density invariant. The worst case performance will be significantly worse than the best case.
For example:
If players check out other players within 10m of themselves, then every player will see everyone if they all go to the same spot
If your world is split into grid squares and a player sends a chat message to every player in the same square, then every message will be received by everyone if they go to the same grid square
Use budgets rather than units.
Check out the nearest 50 players rather than any within 10m
Send chat messages to the nearest 50 players rather than to others in the same grid square
Project structure
MSquared aims to structure projects as closely to native Unreal Engine as possible and supports development within the project content folder. We encourage new projects to be structured in a way in which:
The majority of content is stored within the project content folder
Plugins are used to define libraries of shareable content
This is the project structure used by our internal projects and as such, this structure is the most widely tested and least likely to lead to avoidable issues.
Due to legacy reasons, some older projects may have content entirely within plugin(s) but this is not a current limitation of the platform. Ultimately, the choice for project structure is down to the user.
Last updated