GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Showroom SA:MP => Discussion démarrée par: S!m le 29 Octobre 2009, 23:51:37
-
[FS] SuperStream
Presentation
Salut à tous, je vous présente mon nouveau streamer, le SuperStream (que l'on peut surnommer SS).
Donc voila, le SS est une version faite par moi de A à Z, j'ai demander conseil à quelques personnes de mon entourage concernant l'optimisation et ai décidé de ne pas faire de système complexe, rendant le système plus simple à comprendre et donc modifier
Cible
Il a été testé avec 4 joueurs, ce streamer s'adresse aux serveurs moyen qui on un nombre de joueur moyen et une quantité d'objet normale, bref on oublie déjà les serveurs de 120 joueurs et 20 000 objets.
Fonctionnement
En gros, ce streamer vérifie si les objets sont à une distance maximale du joueur (afin d'ajuster cette distance, voir les #define en haut du script) puis choisi un nombre constant d'objets au joueurs, les plus près. Il permet ainsi d'être utilisé pour des maps comprenant une densité d'objets importante (tout comme SimStream). La différence principale réside dans la réduction du nombre d'options et la modification de la logique de certaines parties. Ce script est conçu pour sa-mp 0.3. Puisque certaines fonctionnalités ont été éliminées lors du passage 0.2X -> 0.3, j'ai pu simplifier grandement le streamer, par exemple les AttachPlayerObjectToPlayer n'existe plus, rayant ainsi cette fonctionnalité du streamer. L'algorithme du déplacement d'objet a été revu (simplifier).
Le streamer s'assure en tout temps de ne pas faire de calculs inutiles. Il comporte un test afin de réduire les calculs inutiles, il vérifie qu'un certains laps de temps c'est écoulé depuis le dernier calcul de position avant de le forcer via le timer. J'ai contourné le bug de GetTickCount sous linux en utilisant un timer afin de connaitre le temps écoulé depuis le lancement du serveur (de base, j'ai mis une précision de 25 millisecondes, mais vous pouvez changer cette valeur grâce aux #define en haut).
Méthodes d'appel au stream
Vous pouvez améliorer le rendu sur votre serveur en forcant le streamer à recalculer les positions. Vous n'avez qu'à include SuperStream.inc dans le script pour pouvoir appelée la fonction StreamPlayer qui recalcule le tout. Il est recommandé d'utiliser cette fonction (StreamPlayer) lors des téléports afin d'accélérer le chargement des objets.
Le streamer comprend également une fonction qui permet d'augmenter le délai du timer, il vérifie en tout temps (via la callback OnPlayerUpdate) que les joueurs ne s'approchent pas trop des extrémités de la zone comprenant des objets. Si jamais le joueur s'approche trop de la limite de cette zone, il force le calcul des objets.
Pourquoi toutes ces méthodes d'appel au stream?
Tout simplement pour permettre un meilleur rendu avec un nombre de calcul minimal. En appelant le streaming au moment nécessaires, on évite des calculs inutiles. Je trouve néanmoins que l'utilisation d'un timer permet un minimum de sécurité de chargement.
Quand devrait-on utiliser StreamPlayer?
Les utilisations pratique de cette fonction sont simple, n'importe quand où il y a un changement important concernant la position où les objets. Par exemple, si vous utilisez un système de rampes, il pourrait être interressant d'utiliser la fonction suite à la création de la rampe afin d'accélérer l'apparition de la rampe pour le joueur. Un autre usage, tel que mentionné ci-dessus, serait lors des téléportations. Je n'ai pas expérimenté de problème de chute lors du chargement de routes suite à un téléport sur mon propre serveur en utilisant correctement cette fonction.
Paramètres
Les paramètres sont tous situés entre la ligne 15 et la ligne 27 du script. Ils consistent en:
- MAX_PLAYERS : Nombre maximum de joueur pouvant être accueillis sur votre serveur
- TIME_GRANULITY : Incertitude sur le temps précis en millisecondes (je recommande de laissé ainsi)
- MOVEMENT_UPDATE: temps (en ms) entre deux mises à jours de la position des objets qui se déplacent (ne change par la fluidité du mouvement vu par les joueurs)
- STREAMING_DELAY : temps minimal depuis le dernier calcul des objets pour un joueur afin de faire le calcul à nouveau (lorsqu'appelé par le timer seulement)
- VIEWED_OBJECTS: nombre maximal d'objets pouvant être vus par un seul joueur
- MAX_STREAM_OBJECTS : nombre maximal d'objets gérés par le streamer (vous devriez mettre la valeur exacte d'objet de votre serveur, afin de réduire les calculs/mémoire utilisée)
- MAX_STREAM_DISTANCE : distance maximale entre un objet et un joueur pour qu'il puisse être visible (si la densité des objets le permet)
.
Installation:
Ce script doit normalement être placé tel quel dans votre dossier filterscript (ne pas oublier d'ajouter SuperStream dans votre server.cfg), vous pouvez changer les defines cités ci-dessus, mais si vous ne savez pas ce que vous faites, vous êtes mieux de ne pas aller plus loin.
Par la suite, pour ajouter de nouveaux objets vous utilisez un autre script (un fs quelconque ou votre gm) dans lequel vous ajouterez la ligne #include <SuperStream.inc>. Vous pourrez désormais utiliser les fonctions suivantes:
native CreateStreamObject(modelid,Float:X,Float:Y,Float:Z,Float:RX,Float:RY,Float:RZ) - Ajoute un nouvel objet
native DestroyStreamObject(objectid) - Enlève un objet complètement
native StreamPlayer(playerid, Float:X, Float:Y, Float:Z) - Force le streaming pour un joueur afin d'accélérer l'apparition des objets
native MoveStreamObject(objectid, Float:TargetX, Float:TargetY, Float:TargetZ, Float:Speed) - Déplace un objets vers les coordonnées TargetX, TargetY, TargetZ
native StopStreamObject(objectid) - Arrête le déplacement d'un objet
native ClearPlayerObjects(playerid) - enlève les objets pour un seul joueurs (peut permettre le respawn forcé de certains objets (pratique pour les barrils explosifs et autres))
native ClearAllObjects() - enlève tous les objets pour tous les joueurs (nettoie tout quoi)
Téléchargement:
Nouvelle version:
Solidfiles - v1.1.4 :
(http://solidfiles.com/info_imgs/Qn0C.jpg) (http://solidfiles.com/d/Qn0C)
Pastebin GtaOnline - v1.1.0
[FS] SuperStream.pwn (http://pastebin.gtaonline.fr/pastebin.php?show=704)
[INC] SuperStream.inc (http://pastebin.gtaonline.fr/pastebin.php?show=705)
Remerciements:
Tous à qui j'ai demandé des petits conseils.
Master-bru et xTig3rZx pour leur aide afin de tester.
Tout ceux que j'ai oublié.
Surtout tous les gens qui font de sa-mp et les communautés qui orbitent autour ce qu'elles sont.
Modifications:
V1.0 : sortie officiel du script
V1.1 : Correction d'un bug avec les MoveStreamObject et ajout de la callback OnStreamObjectMoved, légers ajustement du streaming, bug d'arrêt du fs sans raison apparente semble corrigé..
V1.1.1 : réglage d'un petit bug avec la distance de test pour OnPlayerUpdate
V1.1.2 : correction d'une constante (NO_TICK_COUNT)
V1.1.3 : correction d'un petit problème causé par délai d'update des position dans les données du serveur.
V1.1.4 : tentative de correction d'un bug avec les Interieur
Bugs/Oublis/Commentaires:
Aucun bug/oubli n'a été identifié pour le moment. Merci de le signaler sur ce fil de discussion si vous en trouvez. Les commentaires sont toujours les bienvenus.
ps. Pour ceux qui se demandent pourquoi ne pas avoir posté sur le fil de discussion de SimStream, ma réponse est simple: ce sont deux streamer, oui, mais les différences sont trop importantes pour être considérés comme un même script, ils ne s'adressent pas au même genre de clientèle.
++Sim++
-
GG sim je regarderais ce code demain car la le 00h00 approche lol
-
GG sim je l'attendais avec impassiance vue les teste que tu as fait dessus
-
Salut,
GG sim je regarderais ce code demain car la le 00h00 approche lol
GG sim je l'attendais avec impassiance vue les teste que tu as fait dessus
merci à vous deux,
si tu veut de meilleurs performances/résultats, je te conseille de bien lire ce que j'ai écrit,
je me suis forcé à donner beaucoup d'information pour que les gens s'en servent de façon efficace
Si vous avez besoin de clarification ou autres informations (j'ai peut-être oublié une section), n'hésitez pas à demander plus d'information
++Sim++
-
Béh je trouve que c 'est assez precis =)
Merci a toi ^^
-
tres sympas GG
-
J' ai vu le code et c 'est tres bien fait =)
Encore gg
-
Heu sim je voudrais le mettre sur mon serveur masi le probleme c'est quel fonction que je doit utiliser createobjet ???
-
core_CreateObject(model, Float:OX, Float:OY, Float:OZ, Float:ORX, Float:ORY, Float:ORZ)
-
Super
(Mais pour le nom tu aurait plus choisir autre chose SS ça le fait pas ;) )
Sinon encore une bonne invention de ta part :p
-
Salut,
pour utiliser, il fonctionne un peu comme SimStream, les objets sont dans un autre script, bref regarde les fonctions de l'include, elles devraient être claires
ps.
native CreateStreamObject(modelid,Float:X,Float:Y,Float:Z,Float:RX,Float:RY,Float:RZ) - Ajoute un nouvel objet
native DestroyStreamObject(objectid) - Enlève un objet complètement
native StreamPlayer(playerid, Float:X, Float:Y, Float:Z) - Force le streaming pour un joueur afin d'accélérer l'apparition des objets
native MoveStreamObject(objectid, Float:TargetX, Float:TargetY, Float:TargetZ, Float:Speed) - Déplace un objets vers les coordonnées TargetX, TargetY, TargetZ
native StopStreamObject(objectid) - Arrête le déplacement d'un objet
native ClearPlayerObjects(playerid) - enlève les objets pour un seul joueurs (peut permettre le respawn forcé de certains objets (pratique pour les barrils explosifs et autres))
native ClearAllObjects() - enlève tous les objets pour tous les joueurs (nettoie tout quoi)
EDIT: juste pour être sûr, normalement,!!rien ne devrait être modifié dans le fs sauf les #define cité dans le premier post!! vous utilisez un autre fs ou votre gm pour ajoutez les objets etc....
EDIT2: ajout d'une petite section concernant l'installation
++Sim++
-
Bon voila j'ai mis le FS et j'ai remarquer un truc assez etrange :
Avant :
CreateStreamObject(1634, -2246.421631, -1616.940918, 490.416199, 18.0482, 0.0000, 45.8594, 500);
Apres :
CreateStreamObject(1634, -2246.421631, -1616.940918, 490.416199, 18.0482, 0.0000, 45.8594);
Donc comme vous l'avez remaquer avant il y a a la fin ",500" chose que apres non !
Donc quel compilateur devons nous utiliser pour que sa soit parfait car avant j'utilisait MidoStream ?
Merci d'avance
-
Salut,
tu dois enlever la distance (le 500)
avec SimStream tu n'étais pas obligé de mettre la distance, elle était prise en compte seulement dans un mode du streamer (qui pouvait calculer de différentes façon les objets à montrer)
puisque la méthode utilisée ici ne comporte pas le moindre intérêt à demander une distance de vue des objets, je n'en ai pas mis...
ps. il y aura bientôt une petite mise à jour, j'ai remarqué que je n'avais pas tout à fait complété la partie de déplacement d'objets (MoveStreamObject)
++Sim++
-
Bon apres l'avoir tester asser lomptemp j'ai pu remarquer un bug :P
Enfaite je croit que il ne cree pas tout les objets car sur mon serveur j'ai environ 3000 objets et puis il n'aparaisse pas tous!
-
Salut,
as-tu ajuster la limite d'objets à tes besoins?
si oui, j'aimerais bien savoir ce que tu veut dire par "ils n'apparaissent pas tous", par vague on ne les voient plus ou simplement certains objets sont toujours absents....
++Sim++
-
super avec ta 1.1 c'est le pied intégral merci !
-
super avec ta 1.1 c'est le pied intégral merci !
désolé, je n'ai pas compris sens de ta phrase (eh oui, ne suis pas français d'origine)
si tu veut dire que ça fonctionne bien: merci du commentaire
si tu veut plutôt dire que ça ne marche pas (sarcasmes): merci du commentaire pareil, mais explique ton problème et je ferai ce que je pourrai
++Sim++
-
Je pense qu'il veut dire que c'est bien :)
-
oui il dit avec la version 1.1 c'est super pas de bug apparent
-
bug d'arrêt du fs sans raison apparente semble corrigé..
non moi ça me le fait toujours.
plus rarement mais la ça vien de me le faire.
-
salut,
bug d'arrêt du fs sans raison apparente semble corrigé..
non moi ça me le fait toujours.
plus rarement mais la ça vien de me le faire.
hum, je ne sais pas vraiment quoi te dire, j'ignore toujours d'où vient ce problème, si t'as la moindre idée fais moi s'en part stp, je vais regarder ça quand j'aurai fini mes examens
++Sim++
-
Salut,
désolé pour le double post mais je ne fais que signaler la sortie de la v1.1.4 qui corrige ce qui semble être un bug avec les objets au moment d'un changement d'intérieur (genre entrer dans une maison ou un biz)
++Sim++
-
Salut,
désolé pour le double post mais je ne fais que signaler la sortie de la v1.1.4 qui corrige ce qui semble être un bug avec les objets au moment d'un changement d'intérieur (genre entrer dans une maison ou un biz)
++Sim++
Excusé pour 2mois d'interval ^^
-
J'ai ajouté le streamer sans problème, mais quand je vais sur mon Serveur, et quand j'utilise la commande :
//--------------------------------=[Roadblock]=-----------------------------------
// by Luk0r
if(strcmp(cmdtext, "/poserbarrage", true)==0 || strcmp(cmdtext, "/pb", true)==0)
{
if (PlayerInfo[playerid][pMember] == 1 && PlayerInfo[playerid][pLeader] == 1 || PlayerInfo[playerid][pMember] == 2 && PlayerInfo[playerid][pLeader] == 2 || PlayerInfo[playerid][pMember] == 3 && PlayerInfo[playerid][pLeader] == 3) return SendClientMessage(playerid, COLOR_GREY, "Vous n'êtes pas flic / Membre du FBI / Militaire !");
if (PlayerInfo[playerid][pRoadblock] != 0) return SendClientMessage(playerid, COLOR_GREY, "Vous ne pouvez pas déployer un autre barrage , tapez /rb pour supprimer votre barrage existant.");
if (roadblocktimer != 0) return SendClientMessage(playerid, COLOR_GREY, "Veulliez attendre avant de placer un autre barrage!");
new Float:X, Float:Y, Float:Z, Float:A;
GetPlayerPos(playerid, X, Y, Z);
GetPlayerFacingAngle(playerid, A);
PlayerInfo[playerid][pRoadblock] = CreateObject(981, X, Y, Z, 0.0, 0.0, A+180);
SetPlayerPos(playerid, X, Y, Z+4);
GameTextForPlayer(playerid, "~w~Barrage ~r~Deploye", 5000, 5);
SendClientMessage(playerid, COLOR_GREEN, "Déployement du barrage, tapez /rb ou /retirerbarrage pour le suprimé.");
roadblocktimer = 1;
GetPlayerName(playerid, sendername, sizeof(sendername));
format(string, sizeof(string), "HQ: Un barrage routier à été déployé par %s, ce barrage à été marqué sur la carte.", sendername);
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(PlayerInfo[i][pMember] == 1 || PlayerInfo[i][pLeader] == 1 || PlayerInfo[i][pMember] == 2 || PlayerInfo[i][pLeader] == 2 || PlayerInfo[i][pMember] == 3 || PlayerInfo[i][pLeader] == 3)
{
SetPlayerCheckpoint(playerid, X, Y, Z-10, 1.0);
SendClientMessage(i, TEAM_BLUE_COLOR, string);
if (PlayerInfo[i][pRank] >= 5 && PlayerInfo[i][pMember] || PlayerInfo[i][pLeader] == 1 || PlayerInfo[i][pRank] >= 5 && PlayerInfo[i][pMember] || PlayerInfo[i][pLeader] == 2 || PlayerInfo[i][pRank] >= 5 && PlayerInfo[i][pMember] || PlayerInfo[i][pLeader] == 3)
{
SendClientMessage(i, COLOR_YELLOW, "Vous pouvez supprimer tous les barrages routiers en tapant /rball");
}
}
}
}
SetTimer("ResetRoadblockTimer", 60000, false);
return 1;
}
Le barrage n'apparait pas
j'ai pourtant ajouté les defines (pour les paresseux)
-
Salut,
es-ce que les autres objets (si autres objets il y a) apparaissent?
Serait-il possible que le barrage soit détruit ailleurs de façon presque instantanée?
Tu as bien lancer le fs et ajouté l'include? (désolé de descendre à ces questions mais bon...)
++Sim++
-
Réglé, mais merci quand meme
La soluce :
Remplacé :
CreateObject(981, X, Y, Z, 0.0, 0.0, A+180);Par :
CreateStreamObject(981, X, Y, Z, 0.0, 0.0, A+180);
Et pareil pour la destruction du barrage avec : DestroyStreamObject
Faut croire que le Define à fait une exception.
-
Désolé du double post, mais j'ai d'autre soucis et questions
Soucis :
_ Lorsque je rentre dans l'hôpital, mon perso tombe dans le vide avant que le décor est fini de chargé.
Questions :
_ es ce possible de réduire le temps de chargement des objets ?
_ Si oui quelle à quel ligne ?
_ Ce streamer peut géré combien d'objet maximum (environs) ?
Je pense que c'est tout
-
Salut,
je vais essayer de répondre clairement:
1. Oui c'est possible, utilise StreamPlayer (si me mémoire est bonne), se référer au premier post
2. premier post...
3. Il est paramétré à 5 000, mais j'ai déjà testé 20 000 (attention, j'étais seul). Le mieux c'est de voir toi même. Si tu remarque un ralentissement ou un usage trop important de ton CPU tu sais que ce n'est plus le streamer qu'il te faut. L'idéal reste un streamer semblable avec des zones en plugin (serait encore mieux intégré à sa-mp, mais faut pas rêver).
bonne chance ;)
++Sim++
-
Merci, Ton Fs + Include ma permis de résoudre mon probléme .