(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();
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?