/// <summary>
        /// Starts the overlay
        /// </summary>
        /// <returns>A Task that finishes once the overlay window is ready</returns>
        public async Task Start()
        {
            cancellationTokenSource = new CancellationTokenSource();
            renderThread            = new Thread(async() =>
            {
                window         = new Sdl2Window("Overlay", 0, 0, 2560, 1440, this.windowFlags, false);
                graphicsDevice = VeldridStartup.CreateGraphicsDevice(window,
                                                                     new GraphicsDeviceOptions(false, null, true),
                                                                     GraphicsBackend.Direct3D11);
                commandList  = graphicsDevice.ResourceFactory.CreateCommandList();
                imController = new ImGuiController(
                    graphicsDevice,
                    window.Width,
                    window.Height);
                window.Resized += () =>
                {
                    graphicsDevice.MainSwapchain.Resize((uint)window.Width, (uint)window.Height);
                    imController.WindowResized(window.Width, window.Height);
                };

                NativeMethods.InitTransparency(window.Handle);
                NativeMethods.SetOverlayClickable(window.Handle, false);
                AddFonts();
                imController.Start();
                if (!overlayIsReady)
                {
                    overlayIsReady = true;
                }

                PostStart();
                await RunInfiniteLoop(cancellationTokenSource.Token);
            });

            renderThread.Start();
            await WaitHelpers.SpinWait(() => overlayIsReady);
        }