hitch warning: um quadro de N milissegundos
Alguma coisa congelou o servidor por um instante. Os jogadores sentem como um engasgo. É um sintoma, não uma falha.
Faça isto primeiro
Alguns na subida são normais. O tempo todo durante o jogo significa que algum script precisa ser olhado.
O que significa
Alguma coisa bloqueou a thread principal por esse tempo. Isso NÃO é um erro: nada falhou e nada caiu. É o runtime avisando que um quadro demorou muito mais do que deveria, e os jogadores sentem isso como um congelamento.
Encare como um sintoma com um número ao lado. Abaixo de uns 100 ms costuma ser ruído da inicialização; engasgos sustentados acima de 200 ms durante o jogo normal são um problema de verdade.
O que causa isso
Ordenado pela frequência com que é a resposta.
- 1
Uma consulta síncrona ao banco de dados no servidor
O tick inteiro espera o MySQL. Um índice faltando leva isso de invisível a várias centenas de milissegundos.
- 2
Trabalho pesado durante a inicialização de um resource
Analisar uma configuração JSON grande, construir uma tabela enorme, carregar centenas de props. Engasgos que só acontecem ao subir costumam ser inofensivos.
- 3
Um laço apertado sem Wait
while true do ... endsem ceder trava o escalonador até terminar. - 4
Transmitir muitos assets de uma vez
Pedir muitos modelos ou dicionários de animação no mesmo quadro.
- 5
Um handler de eventos lento
Um evento que dispara por jogador, fazendo trabalho de verdade, num servidor cheio.
Como saber qual é o seu
resmon 1
no console do cliente mostra o uso de CPU por resource. Do lado do servidor, o txAdmin e o profiler embutido apontam o resource. Cruze o momento do engasgo com o que estava acontecendo: uma onda de entradas, o restart de um resource, ou uma ação específica de um jogador.
Onde olhar
O resource que o resmon aponta, e depois as threads e as chamadas ao banco de dados dele.
Como consertar
Ceda o controle dentro dos laços longos, faça as consultas assíncronas, e indexe o que você filtra:
-- bloqueante
local rows = MySQL.query.await('SELECT * FROM users')
-- não bloqueante
MySQL.query('SELECT * FROM users WHERE identifier = ?', { id }, function(rows)
-- ...
end)
-- ceda sempre
CreateThread(function()
while true do
Wait(500) -- nunca omita isso
end
end)Ainda travado no seu próprio código?
Esta página é o que esse erro costuma significar. Cole o seu console no Server Fixer e ele vai ordenar tudo o que estiver lá e te dizer o que fazer primeiro; e se você preferir não mexer, o ORBIE consegue consertar o script e te devolver o resource pronto para soltar.
bug_reportAbrir o Server FixerPara esse tipo de erro, o Script Optimizer encontra o que está custando quadros e reescreve.