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", 1000, true, "d", playerid); return 1; }
public OnPlayerDisconnect(playerid, reason) { 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", 1000, true, "d", playerid); return 1; }
public OnPlayerDisconnect(playerid, reason) { 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?
|