THE ORB
Iniciando o studio

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.

groupsEngasgos e picos de lagcodePrecisa de um desenvolvedor

Faça isto primeiro

Alguns na subida são normais. O tempo todo durante o jogo significa que algum script precisa ser olhado.

bug_reportMelhor colar o console inteiro

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. 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. 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. 3

    Um laço apertado sem Wait

    while true do ... end sem ceder trava o escalonador até terminar.

  4. 4

    Transmitir muitos assets de uma vez

    Pedir muitos modelos ou dicionários de animação no mesmo quadro.

  5. 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 Fixer

Para esse tipo de erro, o Script Optimizer encontra o que está custando quadros e reescreve.

Erros que andam junto com este