Discussion sur les streamers
Je vous invite tous à partager vos idées sur les méthodes que l'on pourrait utiliser dans un streamer, le tout dans le but de créer de nouveaux streamers plus efficaces et qui effectuent mieux le travaille de point de vue du joueur. Soyez imaginatifs. Le but? très simple: créer une nouvelle génération de streamer plus efficaces, plus propres, qui seraient pratiquement invisibles aux yeux des joueurs, sans pour autant monopoliser la machine sur laquelle ils sont exécutés.
Si vous ne savez pas ce qu'est un streamer, veuillez vous abstenir de poster. Ce fil de discussion s'adresse principalement aux scripteurs avancés.
Avant toute chose, la plupart des idées que je vais donner ici proviennent de ce topic: Two Topic by Y_LESS (http://forum.sa-mp.com/showthread.php?t=183071)
Tout comme Y_LESS, je pense qu'il faut séparer le sujet en 3 sous-sujets.
- 1. Algorithme de gestion des objets. C'est à dire l'idée principale de la méthode de calcul, exemple simple calcul de distance, utilisation de zones...
- 2. Implantation de l'algorithme. Certains algorithmes représentes des défis à implantés, pour éviter les limites principalement et que le code soit propre.
- 3. Gestion de l'interaction avec les scripts. Comment on s'arrange pour que ce soit très simple à utiliser et que tous les scripts y aient accès.
1. Algorithme
L'algorithme, c'est le principe de fonctionnement du streamer. L'idée derrière le script. Par exemple, on peut simplement tester la distance entre un joueur et un objet et décider ainsi si l'on affiche ou non l'objet. On peut aussi regarder la distance de plein d'objets et choisir les objets les plus proches parmi la liste.
Je vais ci dessous présenter quelques algorithmes relativement connus.
Distance de vue simple:
Cet algorithme consiste simplement à regarder si un objets est dans un certains rayon autour d'un joueur. Les streamer utilisant ce principe sont: xobjects, midostream, ...
Ces streamer sont les plus simple, les plus limités et ceux qui comportent le plus de problèmes potentiels quant à ne pas voir certains objets proches quand la densité d'objet d'une zone est grande.
Le code est, à la base, à peu près structuré ainsi:
Stream(playerid)
{
for(new o = 0; o < MAX_STREAM_OBJECTS; o++)
{
if(IsPlayerInRangeOfPoint(playerid, MAX_VIEW_DIST, obj[o][x], obj[o][y], obj[o][z]))
{
on affiche l'objet
}
else
{
on cache l'objet
}
}
}
Le principal avantage de cet algorithme, c'est qu'il est simple à coder.
Distance, les plus proches:
Cet algorithme affiche les objets les plus proches d'un joueur, un peu plus difficile à implanter que l'algorithme précédant, il demande un peu plus de calcul mais évite le problème d'objets très proches qui peuvent ne pas apparaitre. De plus la distance de vue n'est plus un paramètre, elle varie en fonction de la densité d'objet de la zone dans laquelle se trouve le joueur. Un exemple de streamer utilisant cette méthode est SuperStream.
Le code est à peu près structuré comme ceci:
Stream(playerid, Float:X, Float:Y, Float:Z)
{
new array_objects[MAX_STREAM_OBJECTS][2];//on va stocké dans cet array les distances et les ID des objets pour pouvoir les ordonner selon la distance ensuite
for(new o = 0; o < MAX_STREAM_OBJECTS; o++)
{
array_objects[o][0] = o;
array_objects[o][1] = GetDistance(X, Y, Z, obj[o][x], obj[o][y], obj[o][z]);
}
order(array_object);//fonction qui place les objets du plus proche au plus loin
for(new o = MAX_STREAM_OBJECTS; o >= MAX_OBJETS_VUS; o--)
{
on efface les objets qui ne doivent pas être vus
}
for(new o = 0; o < MAX_OBJETS_VUS; o++)
{
on crée les objets qui doivent être vus
}
}
Cet algorithme, bien que plus difficile à implanter, permet une bonne amélioration de la qualité de l'illusion générée par le streamer et ne comporte pas de problème majeur. Toutefois, il faut faire attention car cette méthode demande plus de calcul et peut donc gérer un moins grand nombre d'objets.
Division de l'espace en zones:
Cette méthode consiste simplement à divisé l'espace en zone, on peut ainsi ne parcourir que les objets qui sont près du joueur, ce qui permet d'augmenter grandement la limite d'objets, surtout s'ils sont bien distribués sur la carte. Cette méthode est utilisé, entre autre, par Simstream et Y_objects. D'ailleurs on peut le remarquer dans la limite du nombre d'objet. Toutefois, je dois admettre que je l'ai plutôt mal implanté dans Simstream...
Le code de ce genre de méthode demande l'ajout de quelques fonctions, comme une fonction pour ajouter/retirer un objet d'une zone, le changer de zone etc... il faut faire attention à la façon dont on les gère. Je ne donnerai pas d'exemple pour cette méthode car plus complexe et longue à coder...
Autres:
Il existe bien sur plusieurs autres méthode. D'ailleurs, c'est le but de ce topic, trouver de nouvelles méthode qui pourraient être plus efficaces que celles déjà utilisées.
Dans une autre catégorie d'algorithme, on peut aussi déterminer la position ou SERA le joueur. Il ne faut pas oublier que la position récupérer est la dernière position connue du serveur, que la position est déjà différente et que le temps que les données soient reçus, le joueurs aura bougé. On peut donc ajuster selon la position probable du joueurs quels objets il verra. C'est ici que la velocity devient utile.
2. Implantation de l'algorithme
Le second défi de la création d'un streamer, est l'implantation de l'algorithme, je ne m'éterniserai pas sur cette section, mais elle est tout de même importante.
Certaines des méthodes présentés sont relativement difficiles à implanter, par exemple, la méthode des objets les plus proches demande une fonction pour classer les objets, cette fonction, afin de la rendre efficace, nécessite l'utilisation de méthodes de classement qui peuvent être relativement compliquées.
ps. concernant la fonction de classement, je recommande d'utiliser QuickSort de Y_Less, modifiée pour un array à 2 dimensions.
En ce qui concerne l'utilisation de zones, le défi vient quant à la gestion des zones elles mêmes, les concevoir de façon à ne pas limiter l'utilisateur. Par exemple, dans SimStream on ne peut ajouter d'objets hors des zones, c'est à dire à une valeur en X ou Y supérieure à 4000 ou inférieure à -4000 (dépendant des paramètres). Une solution est de créer une zone supplémentaire dans laquelle on place tous les objets qui ne sont pas dans les zones normales. De plus, trouver une façon d'ajouter les zones sans pour autant multiplier la quantité de mémoire utilisée par le script est un défi. Je recommande ici l'utilisation de listes.
Cette section est plutôt importante dans la discussion, selon moi.
3. Gestion de l'interaction avec les scripts
Cette section est celle qui pourrait être la plus complexe, si l'on veut une intégration la plus invisible possible.
L'idéal serait de n'avoir qu'à inclure le streamer dans chacun des scripts et que tout fonctionne.
Bien sur, ceci est difficile.
Une méthode proposée par Y_LESS est l'utilisation de son master system. En gros, ce système permet de gérer l'interaction de scripts entre eux. Ils sont tous identiques, ils comportent tous les streamer et la possibilité de communiquer avec les autres, d'être client ou serveur.
Toutefois, le système désigne l'un des script comme le maitre.
Les autres font appel à lui comme serveur, et lui est le streamer.
YSI comporte cette fonction. Toutefois, c'est très difficile à implanter.
Y_LESS admet que son système était rendu très compliqué et lourd à coder, c'est l'une des raisons pourquoi il a arrêté ce projet.
Une autre méthode, qui selon moi est beaucoup plus envisageable pour le moment, est la création d'un filterscript qui sera le serveur, et tous les scripts font appel à lui avec des CallRemoteFunction. Cette méthode est l'une des plus utilisée. SuperStream, SimStream, midostream... utilisent cette méthode.
Dernière méthode et la moins intéressante, Tout mettre ses objets dans un seul filterscript qui est le streamer. Xobject utilise cette méthode.
Cci cause de nombreux inconvénient.
On ne peut mettre les objets que dans un script, limite l'interaction des autres scripts...
Ce que je vous demande
Après avoir lu tout ce texte (et au besoin le monstre de Y_LESS), je vous demande trois petites choses:
partagez vos idées pour des améliorations. Que ce soit dans n'importe quelle des sections présentées, vos idées seront toutes les bienvenues.
Soyez original, essayez d'éviter les idées déjà connus (je ne les ai pas toutes listées).
Soyez précis, donnez autant de détails que possible, afin de facilité la compréhension de votre idée.
Merci de votre attention.
Sim.