ClientTick = ServerTick

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • ClientTick = ServerTick

      Huhu,

      ich bin letztens über etwas gestolpert..
      ..vielleicht nicht für jeden akzeptabel aber ich sag es einfach mal so: Ich wollte meinen Flooder "perfektionieren" und automatisch laufen lassen. Aber mit ca. 1337 Ticks pro Sekunde werden ne menge Packets gesendet, was eindeutig zu viel ist. Die Ticks im Client entsprechen also meinen FPS (Frames per Second / Bilder pro Sekunde). Da dies etwas zu viel ist, musste ich mir überlegen wie ich die Tickzahl kleiner bekomme.

      Also als ich langeweile in der Schule hatte, habe ich mir da etwas überlegt. Man nehme einen Integer, zähle in jeden ClientTick hoch, bis er eine Zahl erreicht hat, die so berechnet wird: FPS / TICK_SPEED. So ganz im grobem sieht das denn aus. Mal zum Codeteil:

      Ich habe das ganze in src/engine/client/client.cpp programmiert.

      Zuerst brauchen wir ein paar Variabeln. 2 werden im Header (client.h) deklaiert und einer in der client.cpp Datei (Bezeichnung dafür kenne ich nicht.
      Und zusätzlich eine Funktion, die wir Tick(); nennen.
      [cpp]
      //variablen die ihr im header deklaieren müsst. (src/engine/client/client.h) + eine funktion
      float m_AverageFPS;
      int m_iTick;

      // die funktion
      void Tick();
      [/cpp]
      In der Client.cpp Datei sucht ihr dann nach der Funktion "Run()", worin ihr dann while(1) finden solltet.
      darin kommt folgender (kommentierter Code):
      [cpp]
      float FPS = 1.0f / FrameTime(); //die fps zahl, mit der gerechnet wird
      m_AverageFPS = (m_AverageFPS*(1.0f-(1.0f/m_AverageFPS))) + (FPS*(1.0f/m_AverageFPS)); //sie wird genau & auf eine ganze zahl mathematisiert (unnötiges wort, mir viel grad nichts anderes ein)
      m_iTick++; // der iTick wird jeden ClienTick erhöht
      if(m_iTick >= round(m_AverageFPS/g_Config.m_Ticks)) //sobald der iTick gleich oder höher als FPS/TICK_SPEED ist, wird..
      {
      m_iTick = 0; // iTick auf 0 zurückgesetzt
      Tick(); //und die Funktion Tick() aufgerufen.
      }
      [/cpp]
      Würdet ihr diesen Code jetzt Fertig haben, fehlt noch ein kleiner Schritt damit alles Funktioniert: Vor der WhileSchleife "while(1)" müsst ihr
      folgenden Code setzen, denn ohne diesen Funktioniert der Tick nicht richtig.
      [cpp]
      m_AverageFPS = 1.0f;
      [/cpp]
      Hinweis: TickSpeed entspricht den Ticks pro Sekunde, den ihr selbst einstellen könnt.

      EDIT: Kleine Erklärung zu dieser Berechnung: round(m_AverageFPS/g_Config.m_Ticks)
      Nehmen wir an, unsere FPS Zahl lautet zb. 1000. Sie wird dann durch g_Config.m_Ticks genommen (50) und daraus erhält man 20.
      Da der iTick jeden ClientTick erhöht wird, und "abgefangen" wird, wenn er 20 ist wird ein Tick wie im Server simuliert.
      Weil 20*50 = 1000.

      Hoffentlich konnte ich damit ein paar Leuten helfen ;)

      MfG.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Tim ()

    • Wenn ich das richtig verstehe, kann man es auch so lösen:
      [cpp]// führe alle 20 ticks aus
      if (tick % 20 == 0)
      {
      // ...
      }[/cpp]
      Oder auch anhand der FPS:
      [cpp]int fps = 1000;
      int ticksperservertick = fps / 50;
      if (tick % ticksperservertick == 0)
      {
      // ...
      }[/cpp]
      Ich hab da jetzt einfach tick geschrieben, das muss durch das ersetzt werden, womit man wirklich den Tick bekommt.