Portal SAMP
[Ajuda] OnPlayerUpdate + gettime usando muita CPU pra detectar players pausados/afk - 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] OnPlayerUpdate + gettime usando muita CPU pra detectar players pausados/afk (/showthread.php?tid=3477)

Páginas: 1 2


RE: OnPlayerUpdate + gettime usando muita CPU pra detectar players pausados/afk - White_Blue - 29/03/2023

(29/03/2023 11:37)hiwyn Escreveu:
(29/03/2023 11:11)RodrigoMSR Escreveu: Certo.

GetTickDiff está no timer de 1 segundo, não na OnPlayerUpdate, então mesmo que seja um pouco mais lento, não vai afetar em nada. E mesmo se estivesse, ainda é melhor que usar gettime.

Benchmark:

Código:
new tick = GetTickCount();
for(new i = 0; i < 2000000; i++)
{
    gettime();
}
printf("gettime: %dms", GetTickCount() - tick);


tick = GetTickCount();
for(new i = 0; i < 2000000; i++)
{
    GetTickDiff(GetTickCount(), tick);
}
printf("GetTickCount + GetTickDiff: %dms", GetTickCount() - tick);

Resultado (Linux):

gettime: 1676ms
GetTickCount + GetTickDiff: 87ms

No Windows a diferença é bem menor, mas no Linux foi quase 20x mais lento.

muito obrigado, melhor impossivel!

eu fiz certo a resolução pra fugir do overflow?

mais uma coisa, pensei numa parada pra deixar o onplayerupdate mais leve
Código:
public OnPlayerUpdate(playerid)
{
    if(updatingAFKTime[playerid] == false) {
        AFKTime[playerid] = GetTickCount();
        updatingAFKTime[playerid] = true;
        SetTimerEx("ResetUpdatingAFKTime", 250, false, "i", playerid);
    }
    return true;
}

public ResetUpdatingAFKTime(playerid) {
    updatingAFKTime[playerid] = false;
}

Será que é bom?

Não vejo por que usar a OnPlayerUpdate para esse tipo de coisa, já que ela é chamada milhares de vezes durante a execução do programa e um timer é bem mais otimizado para esse tipo de coisa.


RE: OnPlayerUpdate + gettime usando muita CPU pra detectar players pausados/afk - hiwyn - 29/03/2023

(29/03/2023 11:59)White_Blue Escreveu:
(29/03/2023 11:37)hiwyn Escreveu:
(29/03/2023 11:11)RodrigoMSR Escreveu: Certo.

GetTickDiff está no timer de 1 segundo, não na OnPlayerUpdate, então mesmo que seja um pouco mais lento, não vai afetar em nada. E mesmo se estivesse, ainda é melhor que usar gettime.

Benchmark:

Código:
new tick = GetTickCount();
for(new i = 0; i < 2000000; i++)
{
    gettime();
}
printf("gettime: %dms", GetTickCount() - tick);


tick = GetTickCount();
for(new i = 0; i < 2000000; i++)
{
    GetTickDiff(GetTickCount(), tick);
}
printf("GetTickCount + GetTickDiff: %dms", GetTickCount() - tick);

Resultado (Linux):

gettime: 1676ms
GetTickCount + GetTickDiff: 87ms

No Windows a diferença é bem menor, mas no Linux foi quase 20x mais lento.

muito obrigado, melhor impossivel!

eu fiz certo a resolução pra fugir do overflow?

mais uma coisa, pensei numa parada pra deixar o onplayerupdate mais leve
Código:
public OnPlayerUpdate(playerid)
{
    if(updatingAFKTime[playerid] == false) {
        AFKTime[playerid] = GetTickCount();
        updatingAFKTime[playerid] = true;
        SetTimerEx("ResetUpdatingAFKTime", 250, false, "i", playerid);
    }
    return true;
}

public ResetUpdatingAFKTime(playerid) {
    updatingAFKTime[playerid] = false;
}

Será que é bom?

Não vejo por que usar a OnPlayerUpdate para esse tipo de coisa, já que ela é chamada milhares de vezes durante a execução do programa e um timer é bem mais otimizado para esse tipo de coisa.

se eu colocar esse
Código:
AFKTime[playerid] = GetTickCount();
em qualquer timer a verificação de 1 segundo

Código:
// ongamemodeinit



SetTimerEx("PlayerOneSec", 1000, true, "i", playerid);

Código:
public PlayerOneSec(i) {



        // check paused



        if(paused[i] == false) {



            // 3 segundos sem resposta.



            if(GetTickCount() - AFKTime[i] > 3000) { OnPlayerPause(i); }



        }



        if(paused[i] == true) {



            if(GetTickCount() - AFKTime[i] < 3000) { OnPlayerUnpause(i); }



        }

não funciona, não sei pq, mas nunca detecta qnd o player fica de pause

você consegue fazer funcionar fora do OnPlayerUpdate?


RE: OnPlayerUpdate + gettime usando muita CPU pra detectar players pausados/afk - White_Blue - 29/03/2023

(29/03/2023 13:57)hiwyn Escreveu:
(29/03/2023 11:59)White_Blue Escreveu:
(29/03/2023 11:37)hiwyn Escreveu:
(29/03/2023 11:11)RodrigoMSR Escreveu: Certo.

GetTickDiff está no timer de 1 segundo, não na OnPlayerUpdate, então mesmo que seja um pouco mais lento, não vai afetar em nada. E mesmo se estivesse, ainda é melhor que usar gettime.

Benchmark:

Código:
new tick = GetTickCount();
for(new i = 0; i < 2000000; i++)
{
    gettime();
}
printf("gettime: %dms", GetTickCount() - tick);


tick = GetTickCount();
for(new i = 0; i < 2000000; i++)
{
    GetTickDiff(GetTickCount(), tick);
}
printf("GetTickCount + GetTickDiff: %dms", GetTickCount() - tick);

Resultado (Linux):

gettime: 1676ms
GetTickCount + GetTickDiff: 87ms

No Windows a diferença é bem menor, mas no Linux foi quase 20x mais lento.

muito obrigado, melhor impossivel!

eu fiz certo a resolução pra fugir do overflow?

mais uma coisa, pensei numa parada pra deixar o onplayerupdate mais leve
Código:
public OnPlayerUpdate(playerid)
{
    if(updatingAFKTime[playerid] == false) {
        AFKTime[playerid] = GetTickCount();
        updatingAFKTime[playerid] = true;
        SetTimerEx("ResetUpdatingAFKTime", 250, false, "i", playerid);
    }
    return true;
}

public ResetUpdatingAFKTime(playerid) {
    updatingAFKTime[playerid] = false;
}

Será que é bom?

Não vejo por que usar a OnPlayerUpdate para esse tipo de coisa, já que ela é chamada milhares de vezes durante a execução do programa e um timer é bem mais otimizado para esse tipo de coisa.

se eu colocar esse
Código:
AFKTime[playerid] = GetTickCount();
em qualquer timer a verificação de 1 segundo

Código:
// ongamemodeinit



SetTimerEx("PlayerOneSec", 1000, true, "i", playerid);

Código:
public PlayerOneSec(i) {



        // check paused



        if(paused[i] == false) {



            // 3 segundos sem resposta.



            if(GetTickCount() - AFKTime[i] > 3000) { OnPlayerPause(i); }



        }



        if(paused[i] == true) {



            if(GetTickCount() - AFKTime[i] < 3000) { OnPlayerUnpause(i); }



        }

não funciona, não sei pq, mas nunca detecta qnd o player fica de pause

você consegue fazer funcionar fora do OnPlayerUpdate?

A OnGameModeInit não tem o parâmetro playerid, use na OnPlayerConnect ou na OnPlayerSpawn.

Código PHP:
new TimerPause[MAX_PLAYERS] = 0;

public 
OnPlayerConnect(playerid) {
       
TimerPause[playerid] = SetTimerEx("Seu_Timer"1000true"d"playerid);
       return 
1;
}

public 
OnPlayerDisconnect(playeridreason) {
      
KillTimer(TimerPause[playerid]);
      return 
1;




RE: OnPlayerUpdate + gettime usando muita CPU pra detectar players pausados/afk - hiwyn - 29/03/2023

(29/03/2023 14:11)White_Blue Escreveu:
(29/03/2023 13:57)hiwyn Escreveu:
(29/03/2023 11:59)White_Blue Escreveu:
(29/03/2023 11:37)hiwyn Escreveu:
(29/03/2023 11:11)RodrigoMSR Escreveu: Certo.

GetTickDiff está no timer de 1 segundo, não na OnPlayerUpdate, então mesmo que seja um pouco mais lento, não vai afetar em nada. E mesmo se estivesse, ainda é melhor que usar gettime.

Benchmark:

Código:
new tick = GetTickCount();
for(new i = 0; i < 2000000; i++)
{
    gettime();
}
printf("gettime: %dms", GetTickCount() - tick);


tick = GetTickCount();
for(new i = 0; i < 2000000; i++)
{
    GetTickDiff(GetTickCount(), tick);
}
printf("GetTickCount + GetTickDiff: %dms", GetTickCount() - tick);

Resultado (Linux):

gettime: 1676ms
GetTickCount + GetTickDiff: 87ms

No Windows a diferença é bem menor, mas no Linux foi quase 20x mais lento.

muito obrigado, melhor impossivel!

eu fiz certo a resolução pra fugir do overflow?

mais uma coisa, pensei numa parada pra deixar o onplayerupdate mais leve
Código:
public OnPlayerUpdate(playerid)
{
    if(updatingAFKTime[playerid] == false) {
        AFKTime[playerid] = GetTickCount();
        updatingAFKTime[playerid] = true;
        SetTimerEx("ResetUpdatingAFKTime", 250, false, "i", playerid);
    }
    return true;
}

public ResetUpdatingAFKTime(playerid) {
    updatingAFKTime[playerid] = false;
}

Será que é bom?

Não vejo por que usar a OnPlayerUpdate para esse tipo de coisa, já que ela é chamada milhares de vezes durante a execução do programa e um timer é bem mais otimizado para esse tipo de coisa.

se eu colocar esse
Código:
AFKTime[playerid] = GetTickCount();
em qualquer timer a verificação de 1 segundo

Código:
// ongamemodeinit



SetTimerEx("PlayerOneSec", 1000, true, "i", playerid);

Código:
public PlayerOneSec(i) {



        // check paused



        if(paused[i] == false) {



            // 3 segundos sem resposta.



            if(GetTickCount() - AFKTime[i] > 3000) { OnPlayerPause(i); }



        }



        if(paused[i] == true) {



            if(GetTickCount() - AFKTime[i] < 3000) { OnPlayerUnpause(i); }



        }

não funciona, não sei pq, mas nunca detecta qnd o player fica de pause

você consegue fazer funcionar fora do OnPlayerUpdate?

A OnGameModeInit não tem o parâmetro playerid, use na OnPlayerConnect ou na OnPlayerSpawn.

Código PHP:
new TimerPause[MAX_PLAYERS] = 0;

public 
OnPlayerConnect(playerid) {
       TimerPause[playerid] = SetTimerEx("Seu_Timer"1000true"d"playerid);
       return 1;
}

public 
OnPlayerDisconnect(playeridreason) {
      KillTimer(TimerPause[playerid]);
      return 1;


eu escrevi errado, ta no onplayerconnect mesmo, mas testa você aí
usa o meu codigo em um timer que não seja o onplayerupdate ve se alguma hora vai detectar o player como afk
não funciona


RE: OnPlayerUpdate + gettime usando muita CPU pra detectar players pausados/afk - tylerthecreator - 29/03/2023

poderia enviar o OnPlayerPause? quero usar o GetTickCount, mas n to conseguindo converter o timer em %s corretamente


RE: OnPlayerUpdate + gettime usando muita CPU pra detectar players pausados/afk - White_Blue - 29/03/2023

(29/03/2023 18:32)tylerthecreator Escreveu: poderia enviar o OnPlayerPause? quero usar o GetTickCount, mas n to conseguindo converter o timer em %s corretamente

OnPlayerPause é a callback de uma include.

https://github.com/Agneese-Saini/SA-MP/blob/master/pawno/include/pause.inc#L36
https://github.com/emmet-jones/New-SA-MP-callbacks/blob/master/callbacks.inc#L313


RE: OnPlayerUpdate + gettime usando muita CPU pra detectar players pausados/afk - hiwyn - 29/03/2023

(29/03/2023 19:17)White_Blue Escreveu:
(29/03/2023 18:32)tylerthecreator Escreveu: poderia enviar o OnPlayerPause? quero usar o GetTickCount, mas n to conseguindo converter o timer em %s corretamente

OnPlayerPause é a callback de uma include.

https://github.com/Agneese-Saini/SA-MP/blob/master/pawno/include/pause.inc#L36
https://github.com/emmet-jones/New-SA-MP-callbacks/blob/master/callbacks.inc#L313

não, não é
é uma public que eu criei que só muda uma booleana

(29/03/2023 18:32)tylerthecreator Escreveu: poderia enviar o OnPlayerPause? quero usar o GetTickCount, mas n to conseguindo converter o timer em %s corretamente

não entendi manin, pode escrever um pouco mais pra ve se eu entendo?