hitch warning: eine Frame-Zeit von N Millisekunden
Etwas hat den Server kurz eingefroren. Spieler merken es als Ruckler. Ein Symptom, kein Ausfall.
Mach das zuerst
Ein paar beim Start sind normal. Ständige während des Spiels heißen, ein Script muss angesehen werden.
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
Eine synchrone Datenbankabfrage auf dem Server
Der ganze Tick wartet auf MySQL. Ein fehlender Index macht daraus von unsichtbar mehrere hundert Millisekunden.
- 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
Eine enge Schleife ohne Wait
while true do ... endohne Abgabe blockiert den Scheduler, bis es fertig ist. - 4
Viele Assets auf einmal streamen
Viele Modelle oder Animations-Dictionaries im selben Frame anfordern.
- 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 öffnenFür diese Art Fehler Script Optimizer findet, was dich Frames kostet, und schreibt es um.