Our experience building an MMO tech demo with Godot 4.4.1 (.NET/C#)

Our experience building an MMO tech demo with Godot 4.4.1 (.NET/C#)

Hi everyone :waving_hand:,

I am working for CipSoft, a game development studio from Germany with many years of experience building and operating online games. My task for the past few months was to evaluate several engines and networking approaches for MMO development, including Godot 4 (.NET/C#).

As part of this evaluation, we built a small but functional 3D MMO tech demo in Godot and created a short trailer that is linked below. We wanted to share our experience, especially from a networking and MMO perspective, in case it is useful to others.

Here’s the short video of our evaluation:
[Youtube]

What we built :hammer_and_wrench:

We created a simple third-person multiplayer tech demo.

  • 3D world
  • Third-person character controller
  • Combat with projectiles
  • AI enemies
  • Respawning players and enemies

The client and server were exported from the same project using different presets.
For load testing, we launched multiple headless bot clients that connected automatically and simulated gameplay.

What we liked :blue_heart:

One of the first things we appreciated about Godot was how lightweight and accessible it is. There is no heavy installation process. You download it and can start working immediately. That simplicity makes it very easy to get going, especially when building prototypes.

The editor feels clean and well structured. After a short adjustment period, especially coming from Unity, the Scene and Node concept starts to make a lot of sense and encourages a modular way of thinking about game architecture. For everyday work, the workflow feels fast and responsive.

We also liked how straightforward it is to create dedicated server builds and run the engine in headless mode. For online games this is an important foundation, and in our experience it worked reliably.

Overall, Godot feels developer-friendly, open and refreshingly lightweight. It makes experimentation easy and allows for quick iteration, which we really value during early prototype phases.

What we found challenging :warning:

From an MMO perspective, we ran into some limitations, mainly around networking and parts of the 3D toolchain.

When using the High Level Multiplayer API with ENet, things worked well for smaller multiplayer scenarios. However, during load testing at around 80 to 100 concurrent clients, we observed server CPU spikes followed by mass disconnects of all connected players. We documented the issue and discussion here:

For context, our server was running on a Linux virtual machine with 2 CPU cores and 2 GB of RAM. The bot clients were distributed across six separate Windows machines. The bots connected automatically, moved through the world, jumped, and engaged enemies in order to simulate real gameplay traffic rather than just idle connections.

With ENet, once we approached the connection threshold mentioned above, the server load increased sharply and eventually resulted in all clients being disconnected.

After investigating the behavior and not finding an acceptable solution, we replaced the High Level API with the Telepathy TCP library and implemented a more custom networking layer. With that setup, server stability under load improved significantly under the same hardware conditions. In this configuration, the bottleneck shifted to the client side, which for us was acceptable since the server remained stable and responsive.

The tradeoff is that this approach requires more custom architecture and shifts more responsibility to the developer instead of relying on engine-level abstractions.

Regarding the 3D toolchain, we noticed that certain workflows require additional external tools or plugins. For example, there is no built-in terrain editor in Godot 4, so creating larger landscapes requires using community add-ons such as Terrain3D.

Even some rendering defaults, such as shadow behavior, require manual adjustments to achieve production-quality results.

From a commercial game development perspective, we also felt that C# is not yet treated on the same level as GDScript within the engine tooling. Especially debugging and performance profiling are significantly better supported for GDScript.

The built in profiler only supports GDScript. When working with C#, profiling inside the engine is currently not available, which means relying on external tools for performance analysis.

Those tools are typically closed source and often expensive. For this evaluation, we did not want to purchase a full annual subscription for JetBrains Rider and JetBrains dotTrace, which is recommended. We used Visual Studio 2022 Professional, which we already have, but only for CPU profiling, since network profiling is not available there.

It is important to note that we did not heavily focus on network optimization during this evaluation. The tech demo was intentionally kept simple and close to default engine behavior in order to assess baseline performance. We did not implement advanced replication filtering, bandwidth optimization, custom prioritization strategies, or deeper architectural scaling approaches. With additional dedicated networking optimization, higher scalability may well be achievable.

Overall Conclusion :bar_chart:

Overall, our experience with Godot 4 was positive, especially in terms of usability, iteration speed and overall accessibility. The engine feels lightweight, modern and very approachable, which makes it great for rapid prototyping and smaller-scale multiplayer projects.

From a strict MMO perspective, particularly regarding high concurrency in a single world instance, we currently consider Godot’s networking, High Level Multiplayer API plus ENet, as insufficient. Achieving the level of stability we expect for large scale online games required moving to a more custom networking solution, which increases engineering effort.

That said, we are aware that Godot is evolving quickly. The pace of development and the openness of the ecosystem are impressive. Many of the areas we touched on may improve significantly in future versions.

We share this not as criticism, but as a transparent report from our evaluation process. If we overlooked something or there are approaches we should have considered, we would genuinely appreciate the discussion.

Thanks to everyone contributing to Godot and building such an ambitious open-source engine.

7 Likes

I think it would be appropriate to change the title to reflect that you used 4.4.1, which is now two versions old. (I’m basing that on the thread you linked where you stated you were using 4.4.1.)

That’s a tiny machine for a server. I would recommend trying it with something beefier and see how performance changes. Does it change at all with 4 processors? Does it change with 4 GB of RAM?

We discussed this quite a bit last year in the thread you linked. The only thing I’ll add is I do not see any mention of load-balancing. While 100 users per server is an issue, I would be interested to see if you could use load balancing on a cloud service to mitigate that.

That’s helpful information, but what was the max number of connections? 150? 500? 1,000? How much of a performance improvement was it?

Agreed. Multiplayer is not Godot’s strong suit at this point.

Personally, I see that as a benefit of an open source project - you have lots of plugins to choose from.

Agreed. Though they are working on that. Did you at any time consider C++ as an alternative?

I enjoyed reading your post mortem. Thanks for taking the time to provide information to the community.

6 Likes

If you have not tried already, Intel VTune is free and supports managed code profiling. There is also AMD uProf. (But to be honest, Intel’s profiler is a lot better.)

Network profiling tends to be very domain-specific, so you often need to add custom instrumentation to your network layer and either export it into an existing trace format (for example something readable by Perfetto), though in practice you will still need to build your own tooling.

Wireshark can help inspect packets and bandwidth, but it is not really a profiler.

It might also be worth it to try out and compare performance against a UDP library like LiteNetLib. (Especially if you are running into TCP Head-of-Line blocking issues).


Though you did not really mention the specifics of how you are encoding data in your networking layer, I am also currently working on the replication layer for my MMO, so here are my observations.

If your payload is a fixed-size unmanaged struct, serialization and copying can be extremely cheap; sometimes you can literally copy the struct memory and send it. However, if the payload contains managed data (dynamic arrays, strings, etc.), the cost increases because you have to manually encode each managed member.

Compression and type packing also affect performance. You can significantly reduce bandwidth by packing values or lowering precision (for example, you usually do not need to send all 12 floats of a Transform3D at full precision). However, this increases CPU cost because the data must be encoded and decoded instead of simply copied. In practice, you would need to profile and find the right balance between CPU cost and bandwidth usage.

In general, a lot of this really depends on how your game is modelled. If your game is structured around a data-oriented design paradigm like an Entity Component System, you tend to get a lot of benefits. Many high-performance multiplayer frameworks assume or internally rely on ECS-style data models, for example Coherence and SpatialOS (though I believe SpatialOS is now defunct).

There are a lot of variables involved, and many of the architectural decisions you make at the networking layer tend to propagate through multiple layers of the engine and game architecture.

In practice most large-scale multiplayer games end up building custom systems around this, and it is unlikely that something this specialized will ever be provided natively in Godot.

Thanks for sharing your experience. The bot client approach is interesting, I will likely try something similar.

2 Likes