From 50e77e705bec6f32fb760749de7e003d531f72d3 Mon Sep 17 00:00:00 2001 From: emil28092005 Date: Thu, 18 Jun 2026 19:12:11 +0300 Subject: [PATCH] fix: MCP server starts after 3rd frame to avoid blocking Vulkan init - MCP server (Kestrel) launched on background thread after 3 frames to avoid conflicting with Vulkan/SDL3 initialization - --mcp-port 0 (default) = disabled, scene works as before - --mcp-port 5000 = MCP starts after 3rd frame - Reduced extra balls from 30 to 10 for stability - Engine.AI/McpEngineServerHost reverted to original (no WebApplicationOptions) --- src/CortexEngine.App/Program.cs | 66 +++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/src/CortexEngine.App/Program.cs b/src/CortexEngine.App/Program.cs index cf42117..d11f716 100644 --- a/src/CortexEngine.App/Program.cs +++ b/src/CortexEngine.App/Program.cs @@ -39,29 +39,8 @@ class Program #if !RELEASE_AOT WebApplication? mcpApp = null; - if (mcpPort > 0) - { - var mcpThread = new Thread(() => - { - Thread.Sleep(2000); - try - { - mcpApp = McpEngineServerHost.Create(Array.Empty(), queue, port: mcpPort); - mcpApp.Run(); - } - catch (Exception ex) - { - Console.WriteLine($"[App] MCP server error: {ex.Message}"); - } - }) - { IsBackground = true }; - mcpThread.Start(); - Console.WriteLine($"[App] MCP HTTP server starting on http://localhost:{mcpPort}/ (SSE)"); - } - else - { - Console.WriteLine("[App] MCP server disabled (--mcp-port 0)."); - } + var mcpStarted = false; + var frameCount = 0; #endif var cameraEntity = world.Entity("Camera") @@ -98,6 +77,29 @@ class Program window.PumpEvents(); input.BeginFrame(); +#if !RELEASE_AOT + frameCount++; + if (mcpPort > 0 && !mcpStarted && frameCount > 3) + { + mcpStarted = true; + var port = mcpPort; + var q = queue; + new Thread(() => + { + try + { + mcpApp = McpEngineServerHost.Create(Array.Empty(), q, port: port); + Console.WriteLine($"[App] MCP HTTP server listening on http://localhost:{port}/ (SSE)"); + mcpApp.Run(); + } + catch (Exception ex) + { + Console.WriteLine($"[App] MCP server error: {ex.Message}"); + } + }) { IsBackground = true }.Start(); + } +#endif + if (window.Width != lastWidth || window.Height != lastHeight) { lastWidth = window.Width; @@ -235,6 +237,24 @@ class Program .Set(RigidBody.DynamicSphere(0.7f, mass: 1.5f)); } + var rand = new Random(42); + for (var i = 0; i < 10; i++) + { + var x = (float)(rand.NextDouble() * 16 - 8); + var y = (float)(rand.NextDouble() * 15 + 5); + var z = (float)(rand.NextDouble() * 16 - 8); + var r = 0.3f + (float)rand.NextDouble() * 0.5f; + var color = new Vector3( + 0.3f + (float)rand.NextDouble() * 0.7f, + 0.3f + (float)rand.NextDouble() * 0.7f, + 0.3f + (float)rand.NextDouble() * 0.7f); + var ballMesh = ProceduralMesh.CreateSphere(r, 16, 8, color); + world.Entity($"Ball{i}") + .Set(new Transform(new Vector3(x, y, z), Quaternion.Identity, Vector3.One)) + .Set(ballMesh) + .Set(RigidBody.DynamicSphere(r, mass: r * 2f)); + } + world.Entity("Floor") .Set(new Transform(new Vector3(0, -0.5f, 0), Quaternion.Identity, new Vector3(20, 0.5f, 20))) .Set(LoadMesh("Content/cube.obj", new Vector3(0.3f, 0.3f, 0.35f)))