hitch warning: un fotograma de N milisegundos
Algo congeló el servidor un momento. Los jugadores lo sienten como un tirón. Es un síntoma, no un fallo.
Haz esto primero
Unos pocos al arrancar son normales. Constantes durante el juego significan que hay que mirar un script.
Qué significa
Algo bloqueó el hilo principal durante ese tiempo. Esto NO es un error: nada falló y nada se cayó. Es el runtime avisando de que un fotograma tardó muchísimo más de lo que debería, y eso los jugadores lo sienten como un congelamiento.
Tomalo como un síntoma con un número al lado. Por debajo de unos 100 ms suele ser ruido del arranque; tirones sostenidos de más de 200 ms durante el juego normal son un problema de verdad.
Qué lo provoca
Ordenado por la frecuencia con la que es la respuesta.
- 1
Una consulta síncrona a la base de datos en el servidor
El tick entero espera a MySQL. Un índice que falta lleva esto de invisible a varios cientos de milisegundos.
- 2
Trabajo pesado durante el arranque de un recurso
Analizar una configuración JSON grande, construir una tabla enorme, cargar cientos de props. Los tirones que sólo pasan al arrancar suelen ser inofensivos.
- 3
Un bucle cerrado sin Wait
while true do ... endsin ceder bloquea el planificador hasta que termina. - 4
Transmitir muchos assets a la vez
Pedir muchos modelos o diccionarios de animación en el mismo fotograma.
- 5
Un manejador de eventos lento
Un evento que se dispara por jugador, haciendo trabajo de verdad, en un servidor lleno.
Cómo saber cuál es el tuyo
resmon 1
en la consola del cliente muestra el uso de CPU por recurso. Del lado del servidor, txAdmin y el perfilador incorporado señalan el recurso. Cruzá el momento del tirón con lo que estaba pasando: una oleada de entradas, el reinicio de un recurso, o una acción concreta de un jugador.
Dónde mirar
El recurso que señala resmon, y después sus hilos y sus llamadas a la base de datos.
Cómo arreglarlo
Cedé el control dentro de los bucles largos, hacé las consultas asíncronas, e indexá lo que filtrás:
-- bloqueante
local rows = MySQL.query.await('SELECT * FROM users')
-- no bloqueante
MySQL.query('SELECT * FROM users WHERE identifier = ?', { id }, function(rows)
-- ...
end)
-- cedé siempre
CreateThread(function()
while true do
Wait(500) -- no lo omitas nunca
end
end)¿Sigues atascado en tu propio código?
Esta página es lo que suele significar este error. Pega tu consola en Server Fixer y ordenará todo lo que haya en ella y te dirá qué hacer primero; y si prefieres no tocarlo, ORBIE puede reparar el script y devolverte el recurso listo para soltar.
bug_reportAbrir el Server FixerPara este tipo de error, el Script Optimizer encuentra qué te está costando fotogramas y lo reescribe.