Weird behaviour start routine executing later than the other functions

Here is my code:
main.cpp

#include <Arduino.h>

#include "SpaceInvaders.h"

SpaceInvaders spaceInvaders;

void setup() {
    Serial.begin(9600);

    spaceInvaders.setup();
}

void loop() {
    spaceInvaders.run();
}

SpaceInvaders.cpp

#include "SpaceInvaders.h"
#include <Arduino.h>

#include "Button.h"
#include "Joystick.h"

#include "Sprites.h"

Button redButton(5);
Button blueButton(6);
Joystick joystick(A0, A1);

int screen[SCREEN_HEIGHT][SCREEN_WIDTH];

void SpaceInvaders::setup() {
    u8g2.begin();
    u8g2.setFont(u8g2_font_5x7_tf);

    redButton.begin();
    blueButton.begin();
    joystick.begin();
}

void SpaceInvaders::start() {
    Serial.println("start");
    for (int i = 0; i < SCREEN_HEIGHT; ++i) {
        for (int j = 0; j < SCREEN_WIDTH; ++j) screen[i][j] = 0;
    }
    screen[10][10] = 1;
}

void SpaceInvaders::readInputs() {
    Serial.println("readInputs");
    redButton.read();
    blueButton.read();
    joystick.read();
}

void SpaceInvaders::update() {
    Serial.println("update");
}

void SpaceInvaders::drawScreen() {
    Serial.println("drawScreen");

    u8g2.clearBuffer();

    for (int i = 0; i < SCREEN_HEIGHT; ++i) {
        for (int j = 0; j < SCREEN_WIDTH; ++j) {
            drawSprite((const unsigned char*)spaceInvadersSprites, GHOST, j*5, i*7);
        }
    }

    u8g2.sendBuffer();
}

void SpaceInvaders::run() {
    Serial.println("Game started.");

    start();
    while (1) {
        readInputs();

        update();

        drawScreen();

        delay(10);
    }
    Serial.println("Game ended.");
}

Looking at this code you would expect the start function to run before the while loop, but when I look at the Serial monitor I see this:

readInputs
update
drawScreen
readInputs
update
drawScreen
readInputs
update
drawScreen
readInputs
update
draGame started.
start
readInputs
update
drawScreen
readInputs
update
drawScreen
readInputs
update
drawScreen

It first run some iterations of the loop and then the start routine is called.

Any idea of why this occurs??

TY.

No issues on my side here (used MCU: ESP32).

I think it is related to the serial connection (and the slow baudrate of 9600).

Change the baudrate to 115200.
After calling Serial.begin(115200);, insert a delay, e.g. delay(1000);, to give your MCU a little time to initialize the serial connection and connect the serial monitor correctly.

Hard resetting via RTS pin...
--- Terminal on COM3 | 115200 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
rv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:1184
load:0x40078000,len:13232
load:0x40080400,len:3028
entry 0x400805e4
setup
Game started.
start
readInputs
update
drawScreen
readInputs
update
drawScreen
readInputs
update
drawScreen
readInputs
update
drawScreen
readInputs
update
drawScreen
Game ended.
Game started.
start
readInputs
update
drawScreen
readInputs
update
drawScreen
readInputs
update
drawScreen
readInputs
update
drawScreen
readInputs
update
drawScreen
Game ended.