THE ORB
Studio wird gestartet

hitch warning: eine Frame-Zeit von N Millisekunden

Etwas hat den Server kurz eingefroren. Spieler merken es als Ruckler. Ein Symptom, kein Ausfall.

groupsRuckler und Lag-SpitzencodeBraucht einen Entwickler

Mach das zuerst

Ein paar beim Start sind normal. Ständige während des Spiels heißen, ein Script muss angesehen werden.

bug_reportFüg lieber deine ganze Konsole ein

Was es bedeutet

Etwas hat den Hauptthread so lange blockiert. Das ist KEIN Fehler: Nichts ist fehlgeschlagen, nichts abgestürzt. Die Runtime meldet, dass ein Frame weit länger gedauert hat, als er sollte — Spieler spüren das als Einfrieren.

Nimm es als Symptom mit einer Zahl daneben. Unter etwa 100 ms ist es meist Startrauschen; anhaltende Ruckler über 200 ms im normalen Spiel sind ein echtes Problem.

Was es auslöst

Sortiert danach, wie oft es die Antwort ist.

  1. 1

    Eine synchrone Datenbankabfrage auf dem Server

    Der ganze Tick wartet auf MySQL. Ein fehlender Index macht daraus von unsichtbar mehrere hundert Millisekunden.

  2. 2

    Schwere Arbeit beim Start einer Resource

    Eine große JSON-Konfiguration parsen, eine riesige Tabelle bauen, hunderte Props laden. Ruckler nur beim Start sind meist harmlos.

  3. 3

    Eine enge Schleife ohne Wait

    while true do ... end ohne Abgabe blockiert den Scheduler, bis es fertig ist.

  4. 4

    Viele Assets auf einmal streamen

    Viele Modelle oder Animations-Dictionaries im selben Frame anfordern.

  5. 5

    Ein langsamer Event-Handler

    Ein Event, das pro Spieler feuert, echte Arbeit macht, auf einem vollen Server.

Wie du erkennst, welcher deiner ist

resmon 1

in der Client-Konsole zeigt die CPU pro Resource. Auf Serverseite zeigen txAdmin und der eingebaute Profiler auf die Resource. Bring den Zeitpunkt des Rucklers mit dem zusammen, was gerade passierte: eine Beitrittswelle, ein Resource-Neustart oder eine bestimmte Spieleraktion.

Wo du nachsehen musst

Die von resmon genannte Resource, dann ihre Threads und ihre Datenbankaufrufe.

Wie du es behebst

Gib in langen Schleifen ab, mach Abfragen asynchron, und indiziere, wonach du filterst:

-- blockierend
local rows = MySQL.query.await('SELECT * FROM users')

-- nicht blockierend
MySQL.query('SELECT * FROM users WHERE identifier = ?', { id }, function(rows)
    -- ...
end)

-- immer abgeben
CreateThread(function()
    while true do
        Wait(500)      -- niemals weglassen
    end
end)

Hängst du immer noch an deinem eigenen Code?

Diese Seite sagt, was dieser Fehler üblicherweise bedeutet. Füg deine Konsole in Server Fixer ein: es sortiert alles darin und sagt dir, was zuerst dran ist; und wenn du lieber nicht ranwillst, kann ORBIE das Script reparieren und dir die Resource fertig zum Einsetzen zurückgeben.

bug_reportServer Fixer öffnen

Für diese Art Fehler Script Optimizer findet, was dich Frames kostet, und schreibt es um.

Fehler, die mit diesem zusammen auftreten