19int main(
int argc, 
char* argv[])
 
   22    unsigned short port = 9000;
 
   25    for (
int i = 1; i < argc; ++i) {
 
   26        std::string arg = argv[i];
 
   28        if (arg == 
"--help") {
 
   33        else if (arg == 
"--port") {
 
   37                    port = 
static_cast<unsigned short>(std::stoi(argv[i]));
 
   39                    std::cerr << 
"[Error] Invalid or out-of-range port: " << argv[i] << 
"\n";
 
   44                std::cerr << 
"[Error] '--port' requires an argument.\n";
 
   50            std::cerr << 
"[Error] Unknown option: " << arg << 
"\n";
 
   57        asio::io_context io_context;
 
   60        auto server = std::make_shared<Server>(io_context, port);
 
   63        unsigned int numThreads = std::max(4u, std::thread::hardware_concurrency());
 
   64        std::vector<std::thread> threadPool;
 
   65        threadPool.reserve(numThreads);
 
   66        for (
unsigned i = 0; i < numThreads; ++i) {
 
   67            threadPool.emplace_back([&io_context]() {
 
   74        std::thread gameLoopThread([&]() {
 
   75            using clock = std::chrono::steady_clock;
 
   76            auto lastTime = clock::now();
 
   79                auto now = clock::now();
 
   80                float dt = std::chrono::duration<float>(now - lastTime).count();
 
   84                server->getGameManager().updateAllGames(dt);
 
   87                std::this_thread::sleep_for(std::chrono::milliseconds(16));
 
   92        std::cout << 
"[Server] Listening on 0.0.0.0:" << port << 
" (UDP)\n";
 
   93        std::cout << 
"[Server] Press ENTER to quit.\n";
 
  100        for (
auto &t : threadPool) {
 
  101            if (t.joinable()) t.join();
 
  103        if (gameLoopThread.joinable()) {
 
  104            gameLoopThread.join();
 
  108    catch (std::exception &e) {
 
  109        std::cerr << 
"[Server] Exception: " << e.what() << 
"\n";