/// <summary> /// Main loop for the server. It should handle everything except login. /// </summary> /// <param name="runInterval">Frame time in miliseconds</param> public void run(long runInterval) { Chronos.setInterval(runInterval); // sunucu dongusunu her 1 runInterval milisaniyede tamamlayacak. while (true) { try { while (true) { Chronos.waitForTheRightMoment(); // fps yi ayarliyor. processUserMessages(); stepAllGames(); } } catch (Exception e) { Console.Write(e.ToString() + "\nStack Trace:\n" + e.StackTrace); } } }
public static void Run() { Chronos.setInterval(50); // sunucu dongusunu her 50 milisaniyede tamamlayacak. while (true) { try { while (true) { Chronos.waitForTheRightMoment(); // fps yi ayarliyor. frameNumber++; Client client; while (justLeftClients.TryDequeue(out client)) { if (clientUserMap.ContainsKey(client)) { clientUserMap.Remove(client); } if (clientPlayerMap.ContainsKey(client)) { clientPlayerMap.Remove(client); } } //var tmp = arrivedMessages; // mesajlari alip queue'ya atan koda yeni bir concurrentQueue verelim. o onu doldururken biz bunu bosaltalim. //Interlocked.Exchange<ConcurrentQueue<MessageArrivedEventArgs>>(ref arrivedMessages, tmpArrivedMessages); // TODO buranin fail olmayacagina emin ol. //tmpArrivedMessages = tmp; tmpArrivedMessages = arrivedMessages; int maxMessagesPerIteration = 50; MessageArrivedEventArgs messageArgs; while (tmpArrivedMessages.TryDequeue(out messageArgs) && maxMessagesPerIteration-- > 0) { RawMessage message = messageArgs.message; if (message.containsField("messageTypeId") == false) { continue; } IIncomingMessage incomingMessage; if (TypeIdGenerator.incomingMessageIds.TryGetValue(message.getInt("messageTypeId"), out incomingMessage)) { //Console.WriteLine(incomingMessage.GetType().Name); incomingMessage.processMessage(messageArgs); } } foreach (var arena in arenas) { arena.Update(); } arenas.RemoveAll(a => a.awaitsDestruction); queue.Update(); } } catch (Exception e) { Console.WriteLine(e.ToString() + "\nStack Trace:\n" + e.StackTrace); } } }