Portal SAMP
[Ajuda] Long callback execution detected (hang or performance issue) - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Long callback execution detected (hang or performance issue) (/showthread.php?tid=1515)



Long callback execution detected (hang or performance issue) - Celudo - 10/08/2021

Boa noite.
Estou com alguns problemas de lentidão no servidor, quando começa a bater bastante players.
Acionei o CrashDetect para tentar detectar algum problema e o seguinte me chamou atenção:

[18:18:53] [debug] #0 0001b564 in public FIXES_OnGameModeInit ()  at C:\Users\Thiago\Desktop\GameMod\Gamemode\pawno\include\sscanf2.inc:199
[18:18:53] [debug] #1 00005220 in public OnGameModeInit () at C:\Users\Thiago\Desktop\GameMod\Gamemode\pawno\include\fixes.inc:8068

Código:
public OnGameModeInit()
{
        if (!SSCANF_gInit)
        {
            new
                name[MAX_PLAYER_NAME + 1];

            SSCANF_Init(GetMaxPlayers(), INVALID_PLAYER_ID, MAX_PLAYER_NAME);
            SSCANF_gInit = true;

            // Check if there are any players that aren't initialized.
            for (new i = 0; i < MAX_PLAYERS; i ++) // LINHA DE ERRO 199
            {
                if (IsPlayerConnected(i) && !SSCANF_IsConnected(i))
                {
                    GetPlayerName(i, name, sizeof(name));
                    SSCANF_Join(i, name, IsPlayerNPC(i));
                }
            }
        }
        #if defined SSCANF_OnGameModeInit
            SSCANF_OnGameModeInit();
        #endif
        return 1;
}

[18:18:56] [debug] AMX backtrace:
[18:18:56] [debug] #0 00012674 in CPSERVICE_getdist (playerid=111, Float:x2=-1830.03796, Float:y2=2484.25391, Float:z2=77.59250) at C:\Users\Thiago\Desktop\GameMod\Gamemode\pawno\include\cpstream.inc:114
[18:18:56] [debug] #1 00011ec8 in public CPSERVICE_Handler () at C:\Users\Thiago\Desktop\GameMod\Gamemode\pawno\include\cpstream.inc:86
[18:18:57] [debug] Long callback execution detected (hang or performance issue)
[18:18:57] [debug] AMX backtrace:
[18:18:57] [debug] #0 00011d80 in public CPSERVICE_Handler () at C:\Users\Thiago\Desktop\GameMod\Gamemode\pawno\include\cpstream.inc:84
[18:18:57] [debug] Long callback execution detected (hang or performance issue)
[18:18:57] [debug] AMX backtrace:
[18:18:57] [debug] #0 00011d90 in public CPSERVICE_Handler () at C:\Users\Thiago\Desktop\GameMod\Gamemode\pawno\include\cpstream.inc:84
[18:18:58] [debug] Long callback execution detected (hang or performance issue)
[18:18:58] [debug] AMX backtrace:
[18:18:58] [debug] #0 00011d34 in public CPSERVICE_Handler () at C:\Users\Thiago\Desktop\GameMod\Gamemode\pawno\include\cpstream.inc:83
[18:18:58] [debug] Long callback execution detected (hang or performance issue)


Código:
public CPSERVICE_Handler()
{
    for(new i; i<MAX_PLAYERS; i++){
        new Float:prevdist = 100000.000;
        new prevcp;
        for(new cpid=1; cpid < MAX_CHECKPOINTS; cpid++){ // LINHA DE ERRO 83
            if(UsedCPSlot[cpid]) { // LINHA DE ERRO 84
                new Float:dist;
                dist = CPSERVICE_getdist(i,Checkpoints[cpid][cpX],Checkpoints[cpid][cpY],Checkpoints[cpid][cpZ]); // LINHA DE ERRO 86
                if(dist < prevdist){
                    prevdist = dist;
                     prevcp = cpid;
                }
            }
        }
        new cpid=prevcp;
        if(CPSERVICE_getdist(i,Checkpoints[cpid][cpX],Checkpoints[cpid][cpY],Checkpoints[cpid][cpZ]) < Checkpoints[cpid][cpsd]) {
            if(CPSERVICE_actualcp[i] != cpid){
                SetPlayerCheckpoint(i,Checkpoints[cpid][cpX],Checkpoints[cpid][cpY],Checkpoints[cpid][cpZ],Checkpoints[cpid][cpsz]);
                CPSERVICE_actualcp[i] = cpid;
            }
        } else {
            if(CPSERVICE_actualcp[i] != 0){
                CPSERVICE_actualcp[i] = 0;
                DisablePlayerCheckpoint(i);
            }
        }
    }
    return 1;
}



RE: Long callback execution detected (hang or performance issue) - xbruno1000x - 10/08/2021

Isso é em função do não uso de foreach.

isso:
Código:
for (new i = 0; i < MAX_PLAYERS; i ++)


deveria ser isso:
Código:
foreach (new i : Player)

O primeiro looping roda 1000 vezes, o segundo irá rodar a quantidade de players online no momento.

Isso pode melhorar o desempenho, porém acho que você deveria tentar o SA-MP Profiler.


RE: Long callback execution detected (hang or performance issue) - Celudo - 10/08/2021

(10/08/2021 19:59)xbruno1000x Escreveu: Isso é em função do não uso de foreach.

isso:
Código:
for (new i = 0; i < MAX_PLAYERS; i ++)


deveria ser isso:
Código:
foreach (new i : Player)

O primeiro looping roda 1000 vezes, o segundo irá rodar a quantidade de players online no momento.

Isso pode melhorar o desempenho, porém acho que você deveria tentar o SA-MP Profiler.

Já utilizei o samp-profiler, está até em outro tópico, mas não entendi e nem vimos nada de relevante.
O foreach não consome muito?


RE: Long callback execution detected (hang or performance issue) - xbruno1000x - 10/08/2021

(10/08/2021 20:19)Celudo Escreveu:
(10/08/2021 19:59)xbruno1000x Escreveu: Isso é em função do não uso de foreach.

isso:
Código:
for (new i = 0; i < MAX_PLAYERS; i ++)


deveria ser isso:
Código:
foreach (new i : Player)

O primeiro looping roda 1000 vezes, o segundo irá rodar a quantidade de players online no momento.

Isso pode melhorar o desempenho, porém acho que você deveria tentar o SA-MP Profiler.

Já utilizei o samp-profiler, está até em outro tópico, mas não entendi e nem vimos nada de relevante.
O foreach não consome muito?

Na verdade o foreach consome menos. Basta reler minha mensagem e entenderá o motivo.


RE: Long callback execution detected (hang or performance issue) - ProKillerPa - 12/08/2021

(10/08/2021 19:59)xbruno1000x Escreveu: Isso é em função do não uso de foreach.

isso:
Código:
for (new i = 0; i < MAX_PLAYERS; i ++)


deveria ser isso:
Código:
foreach (new i : Player)

O primeiro looping roda 1000 vezes, o segundo irá rodar a quantidade de players online no momento.

Isso pode melhorar o desempenho, porém acho que você deveria tentar o SA-MP Profiler.

Caso nao queira usar o foreach, da para usa o loop normal + isplayerconnected, que é o que uso atualmente aliás.

Além disso, voce mencionou o MAX_PLAYERS = 1000, é importante usar um #undef e definir novamente o MAX_PLAYERS para o limite lógico máximo de players online que o servidor possui