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";