This page is a draft for good practices to apply for optimizing GDevelop games.
This draft is WIP by @Bouh

Game optimization is an important concept of game development. Good optimization will allow the game to work faster, making it more fluid.

GDevelop 5 gives you total freedom in events. While this can be awesome, it can also be very costly if you don't have the reflex of writing optimized events, as the processor could get overloaded when running the game. This would cause lag in the game.

It is important to understand what events are and that all events are called once every frame and in the order they were written.

For example: With a game at 60 frames per second (FPS), if you have a single event, without condition, and just one action, then this action should be executed 60 times in a second.

Optimization already in the engine

GDevelop has built in optimizations, like culling, the process of automatically hiding off-screen objects. That way less is rendered and the render gets faster.

This doesn't affect the person creating the game because it's handled in the background. It's totally transparent for everyone. For example, when a sprite is off screen all the animations are paused.

It is still important to hide or disable what you don't need. This is the key to optimization.

Optimizations you can perform

Trigger once

The Trigger once condition causes conditions preceding it in the same event to trigger only once every time they are met.

For example, if you want to create an object every time a click is done, this is what you should not do:

  • What is expected to happen: When the left mouse button is pressed, an object is created called MyObject.
  • What actually happens: As long as the mouse left button is pressed, MyObject instances are created.

This is problematic because when the mouse button is pressed, it is likely held down for longer than a single frame like 0.3 seconds. During this period of time the event is called multiple times, and the object is created more than once.

To fix that we can use the Trigger once condition:

Now, the condition will trigger only once while it is true. That means that the event will fire only once every time it's condition goes from unfulfilled to fulfilled. It resolves the problem above as the condition will fire only the first frame of the click, and will wait for the click to end before letting the click event fire again.

Deactivate unused behaviors

Behaviors take performance, especially the Pathfinding and Physic Engine 2.0 behaviors. Remember to disable them when they are not needed.

Let's take as an example the following situation: I want 100 enemies to move to a position close to them every 2 seconds, and to take into account the wall obstacles.

This would be an intuitive but wrong way to do it: If you do this, all objects will move, including the off-screen ones.

Why calculate movement that the player won't see?

Instead, you can limit the movement to visible objects. This can be done the following way: disable the Pathfinding behavior of the objects not visible in the viewport, and also enable it when they are visible in the viewport.

Don't forget trigger onces to make sure the behavior gets disabled or enabled only when it's state changes from not visible to visible or the other way around

Delete unused objects

Let's take as example the following situation: I have a gun and I create one bullet object instance when I press the key to fire. This bullet has a force toward a direction. If the player shoots many bullets, their amount will increase on the scene and each one requires calculations of the force applied to them in the event loop. If you don't delete old bullet objects they will add up and take more and more performance causing lag to appear after playing for some time. The best solution is to delete the bullets that are off-screen.

The behavior “Destroy when outside of the screen” does just that. Attach it to an object, and all bullets that go off-screen will be deleted.

  • The smaller the images dimensions are the shorter the rendering time gets.
  • Images bigger than 2000px may not work well especially on mobile devices where they may not load.
  • Reduce the number of frames in sprite animations as much as possible, get rid of frames too similar to the one before and next.
  • In order to optimize code to achieve a desired performance metric, use the profiler in GD5 to see where the performance is spent.
  • Reduce number of conditions as object selection is a heavy process.
  • The loading of a game can take a while when the resources are too large, 2Gb of a video or a sound file, will slow down the load time.
  • Consider compressing videos, sounds, and images this will reduce the loading time.
  • All resources in the project are bundle in the exported games if the resource exist in the Resource tab (Project manager>game settings), remember to remove all unused resources.