GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: CarCrasher le 22 Mai 2014, 22:33:41

Titre: Les timers...
Posté par: CarCrasher le 22 Mai 2014, 22:33:41
Coucou et me revoilà !

Donc aujourd'hui pas vraiment de problème par rapport à d'habitude, mais quelque chose que j'avais réalisé il y a pas mal de temps, c'est que les timers sur SA-MP ont une durée qui n'est pas celle qu'on leur attribue.

Par exemple, lorsqu'on démarre un timer d'une minute par exemple, il n'est jamais d'une minute, mais plutôt de quelque chose comme une minute, et quelques secondes.
Les minutes sont donc plus longues que prévues !

Donc par exemple pour une horloge. On aura tendance à faire la plupart du temps un timer d'une minute au terme du quel la fonction d'actualisation du textdraw (ou autre) sera appelée, ou bien seconde, mais le principe reste le même.

Donc SetTimer("UpdateClock", 60000, true);, mais dans ce cas, il s'agira de 64 secondes au lieu de 60.
Maintenant par exemple, il y a des serveurs où des heures sont 'programmées' pour avoir une action, par exemple, un Jour de paie à xxh00 !
Mais imaginons que la dernière fois où UpdateClock aura été appelée était à l'heure réelle de xx-1h59 et 58 secondes !
Le cadran in game affichera xx-1h59, mais lors de la prochaine échéance du timer, l'horloge passera directement de xx-1h59 à xxh01, ce qui dans le cas énoncé peut être frustrant de redevoir attendre une heure.

Même si ça peut paraître assez minime, j'aime pas l'idée que ça se passe comme ça, les bugs doivent être éradiqués !

Donc, ma question, quelqu'un aurait-il un coefficient x tel que (t = temps imputé au timer && ms = millisecondes passées réellement) ms = xt ?!
Et sinon, comment pourrait-on obtenir une valeur exacte et pas un truc genre 16/15 (64/60) !
Avec une fonction Gettickcount (que je ne maîtrise malheureusement pas) en même temps qu'un timer ?!

Enfin celui qui me trouve ça aura un dessin plein de coeurs de ma part !

Alors petit edit ! Finalement je me suis rendu compte que j'étais un imbécile, que GetTickCount c'était super facile à utiliser, une simple soustraction entre deux nombres, à la fin du timer moins au lancage du serveur !

J'ai donc lancé un petit timer de 20 heures, je vous transmettrai les résultats précis de mon enquête !
Titre: Re : Les timers...
Posté par: Ssk le 22 Mai 2014, 23:15:49
Salut, je te déconseille GetTickCount() car cette fonction atteint la limite d'une variable PAWN (32 bits) en 24 jours.

Utilise la fonction gettime().

Code: (pawn) [Sélectionner]
new g_iLastPayCheckTime = gettime();

// 3600 secondes = 1 heure
if(gettime() - g_iLastPayCheckTime >= 3600)
// blahblah
Titre: Re : Les timers...
Posté par: CarCrasher le 22 Mai 2014, 23:34:01
Arf, j'avais vu ça, mais je me suis dit que vu que je lance pas un timer de 24 jours ^^'
Mais c'est plutôt tickcount à la limite je dirais, parce que gettime, c'est pour obtenir l'heure réelle (heure, minute, secondes)
Titre: Re : Les timers...
Posté par: Ssk le 23 Mai 2014, 12:25:44
gettime permet de récupérer le timestamp aussi : http://wiki.sa-mp.com/wiki/Gettime (http://wiki.sa-mp.com/wiki/Gettime)

GetTickCount : http://wiki.sa-mp.com/wiki/GetTickCount (http://wiki.sa-mp.com/wiki/GetTickCount)

GetTickCount will cause problems on servers with uptime of over 24 days (SA:MP server, not physical server !!!) as GetTickCount will eventually warp past the integer size constraints

Si ton serveur est allumé depuis 24 jours, tes "timers" ne fonctionneront plus normalement.
Titre: Re : Les timers...
Posté par: CarCrasher le 24 Mai 2014, 00:47:12
Recoucou les enfants !

J'ai donc créé cette fonction !

Code: (pawn) [Sélectionner]
GetRealTimerValue(time)
{
new Float:a, b;
a = floatdiv(floatmul(time, 3600000), 3985161);
a = floatsqroot(floatpower(a, 2));
b = floatround(a, floatround_round);
return b;
}

Donc je m'explique !
On crée deux variables, un float et un int.
Le float va servir à avoir une plus grande variable, car les nombres peuvent devenir vachement grand vu qu'on calcule en milli-secondes, et corrigez moi si je me trompe, mais le Float permet d'avoir de pouvoir rajouter plus de nombres !

Notre coefficient pour rester dans une certaine limite est de 3600000/3985161 !
Donc, nous divisons le produit du paramètre temps par 3600000 par 3985161.
Nous faisons une racine carrée du carré de ce nombre, pour écarter tout risque de nombres négatifs !
Et finalement, on arrondi tout ces nombres en une variable simple, et c'est envoyé !
Titre: Re : Les timers...
Posté par: Gzsume le 24 Mai 2014, 00:57:22
Juste une précision, les variables de type Float ne permettent nullement d'enregistrer de plus grands nombres, mais simplement des nombres à virgule.
Titre: Re : Les timers...
Posté par: CarCrasher le 24 Mai 2014, 17:52:01
Donc, pour calculer de gros timers, bah, je peux rien faire, sauf les faire à la calculatrice, et les écrire directement dans le SetTimer(Ex) ?
Titre: Re : Les timers...
Posté par: Xartrick le 24 Mai 2014, 18:11:53
Tu peux toujours utiliser une librarie pour manipuler des grands nombres.

Exemple: numlib-samp/numlib.inc at master · lassir/numlib-samp · GitHub (https://github.com/lassir/numlib-samp/blob/master/numlib.inc)

Ici, les nombres ne sont en faite que des chaînes de caractères, je précise que ce n'est pas très optimisé.
Titre: Re : Les timers...
Posté par: S!m le 31 Mai 2014, 04:16:14
Salut,

petit commentaire en passant,

une telle enquête avait déjà été faite avec les versions précédentes de SA:MP sur le forum officiel et on arrive avec un petit problème:

Le décalage temporel dépend de la machine.

On peut toutefois rapidement déterminer le ratio au lancement du serveur en lançant un timer d'une durée connue et en évaluant le temps réel requis etc... et ainsi ajuster le ratio au démarrage du serveur!

++Sim++
Titre: Re : Les timers...
Posté par: Ssk le 31 Mai 2014, 13:43:05
Le décalage dépend de beaucoup de facteur.

http://www.gtaonline.net/forums/index.php/topic,14740.msg270413.html#msg270413 (http://www.gtaonline.net/forums/index.php/topic,14740.msg270413.html#msg270413)

Tout simplement parce que, cela dépend du nombre de joueurs (la durée d'exécution de la fonction de synchro des joueurs), le temps d'exécution des callbacks, etc ..

Vu que toute cette partie (synchro données, exécution des scripts) est dans un seul et même thread, plus l'exécution d'un système est long, plus les timers seront moins précis.
Titre: Re : Les timers...
Posté par: NatiVe™ le 31 Mai 2014, 14:25:44
Le décalage dépend de beaucoup de facteur.

Pour ça, il faut demander à AcidTech.

NV.
Titre: Re : Les timers...
Posté par: CarCrasher le 31 Mai 2014, 16:13:25
Donc, c'est pas un simple petit calcul qui va résoudre ça, mais plutôt un calcul d'énormément de paramètres, d'ailleurs pour certains, comme la synchro par exemple etc., il vaudrait mieux directement utiliser un plugin car le pawn ne permet pas assez pour avoir le contrôle dessus ? :cry: