20-04-2008, 05:56 PM
Allez, premier gros problème sur mon projet: le système de double-carte
[ROMAN INSIDE]
En résumé, y a deux niveaux de carte... la principale (carte Kalidhia, le continent) et chaque case de cette carte correspond à une sous-carte... pour les actions
1. carte continentale
j'ouvre le document "géographie de Kalidhia", hop, mesures... 2500*3000 km, de mémoire. A la base, je me dis: 1km², une case en base de données...
alors, chaque case a :
* un terrain (ID unique d'une autre table)
* présence/absence de route
* présence/absence de cours d'eau
* lié a une province (ID unique d'une autre table)
pour les routes et cours d'eau, j'utilise un tinyint (x2) pour rapidement indiquer l'orientation des routes possibles... avec mes 256 possibilités, je peux créer toutes les intersections possibles (sans générer (256 * 256 * nombre de terrains) imaginables en image sur le serveur.
(en gros, y a 8 extrémités à chaque portion de route possible: les 4 coins d'une case, et les 4 milieux de coté. chaque possibilité recoit une valeur, en partant du milieu haut, en tournant dans le sens des aiguilles (1,2,4,8,16,32,64,128)). j'additionne ce que je veux comme portion, et hop, j'ai ma valeur inférieure à 256.
Bref: a l'affichage de la carte, si route =0 et eau=0 => image terrain simple. Sinon, je génère l'image par code.
Je devrais normalement rajouter encore un tinyint pour les deux... car je peux avoir un sentier, chemin, route, autoroute et ruisseau, rivière, fleuve, canal... 8 choix, ca tient donc aussi en 1 octect.
Enfin, bref, pour celle-ci, j'ai finalement décidé de réduire la grandeur réelle du continent, histoire de pas stocker 1Go de données dans la base. (première estimation, à la première simulation).
Là, sur le portable, j'ai 71Mo pour cette carte. (oui, je bosse sur le portable, et je met sur serveur par packet)
Sur celle-ci, si vous avez des idées pour réduire/optimiser, je prends ^^ (mais c'est pas ma priorité)
je pense aussi que ca va faire un monde très très grand, pour les joueurs... et si je ne peux accepter que 1000 joueurs, ils risquent de pas se croiser souvent... Premier sondage: quelle serait la taille idéale d'une carte d'un contient?
2. sous-carte (tuiles hexagonales, a terme - règle du jeu: 6 assaillants max par cible)
chaque sous-carte représente théoriquement 1km²... soit 1000*1000 cases. Je peux stocker la carte en bdd, pour chaque sous-carte... et hop, j'explose le serveur OVH avant meme de créer un perso (notez que c'est déjà fait avec la carte avant)
Bref: les sous-cartes se génèrent auto à l'entrée d'un perso (si pas déjà existante en bdd) et se désintègrent au départ du dernier (compteur sur le nombre de perso présent sur la carte). Je dois la générer... aléatoirement, mais reproductible, donc pas aléatoire ^^
Là, fonction maison: Je découpe chaque carré (carte) en 9 carrés plus petits. suivant X et Y du continent (+ une variable diff pour chaque case), je fais un modulo pour chacune des 9 cases (sera tjs le meme) => je récupère dans la BDD une portion de terrain de 250*250 cases pour chaque. Là dessus, je repasse deux couches: une pour les routes, et l'autre pour la flotte (pas encore au point, mais c'est l'idée)
bref: je stocke donc ce résultat en bdd pour le perso... et je désintègre le tout dès que possible.
Sauf que 652500 enregistrements, par sous-carte, ca me plait pas... je cherche à stocker ca différement. (notez que chaque enregistrement se trimballe un ID de lien avec la position de la carte continent... je remet pas le X, Y, Z du contient dans chaque, trop lourd. structure: ID, X, Y, Image)
là-dessus, je récupère les persos, les monstres (générés avec la carte) et les objets (objets, pas décors(arbres, rochers, maisons...))
Pour les décors, je fais aussi une magouille: un ID par case... si c'est un sol, no prob. (pas de décor sur la case), si c'est un décor, je récupère le dernier sol utilisé)(oui, la première case sera donc tjs un sol)
puis-je me passer du stockage en bdd?
oui, certainement... je passe par des fichiers sur le serveur (cool, pas d'accès a la bdd)...
XML - serveur?
vais devoir ouvrir a chaque mouvement le fichier sur le serveur (562500 enregistrements, hein - ca tient sur +- 600Ko d'apres mes tests en "xml" perso), charger tout en mémoire pour aller lire les 50-100 cases qu'il me faut. ca me parait lourd.
XML - client?
Envoyer le fichier au navigateur, et le stocker sur le HD du joueur? (est-ce possible? comment récupérer les données? javascript? - + problème: les joueurs pourraient aller chercher/modifier le fichier (voir/modifier la carte donc, rien d'autre)
Enfin, voilà... J'expose un truc qui m'embete depuis un bon bout de temps, pour lequel j'ai une solution, mais je cherche mieux.
Grand merci à ceux qui se pencheront sur ce cas spécial.
(oui, d'habitude, c'est plutot 200*200 cases, j'ai l'impression, pour une seule map)
Ruz, cartographe cinglé
[ROMAN INSIDE]
En résumé, y a deux niveaux de carte... la principale (carte Kalidhia, le continent) et chaque case de cette carte correspond à une sous-carte... pour les actions
1. carte continentale
j'ouvre le document "géographie de Kalidhia", hop, mesures... 2500*3000 km, de mémoire. A la base, je me dis: 1km², une case en base de données...
alors, chaque case a :
* un terrain (ID unique d'une autre table)
* présence/absence de route
* présence/absence de cours d'eau
* lié a une province (ID unique d'une autre table)
pour les routes et cours d'eau, j'utilise un tinyint (x2) pour rapidement indiquer l'orientation des routes possibles... avec mes 256 possibilités, je peux créer toutes les intersections possibles (sans générer (256 * 256 * nombre de terrains) imaginables en image sur le serveur.
(en gros, y a 8 extrémités à chaque portion de route possible: les 4 coins d'une case, et les 4 milieux de coté. chaque possibilité recoit une valeur, en partant du milieu haut, en tournant dans le sens des aiguilles (1,2,4,8,16,32,64,128)). j'additionne ce que je veux comme portion, et hop, j'ai ma valeur inférieure à 256.
Bref: a l'affichage de la carte, si route =0 et eau=0 => image terrain simple. Sinon, je génère l'image par code.
Je devrais normalement rajouter encore un tinyint pour les deux... car je peux avoir un sentier, chemin, route, autoroute et ruisseau, rivière, fleuve, canal... 8 choix, ca tient donc aussi en 1 octect.
Enfin, bref, pour celle-ci, j'ai finalement décidé de réduire la grandeur réelle du continent, histoire de pas stocker 1Go de données dans la base. (première estimation, à la première simulation).
Là, sur le portable, j'ai 71Mo pour cette carte. (oui, je bosse sur le portable, et je met sur serveur par packet)
Sur celle-ci, si vous avez des idées pour réduire/optimiser, je prends ^^ (mais c'est pas ma priorité)
je pense aussi que ca va faire un monde très très grand, pour les joueurs... et si je ne peux accepter que 1000 joueurs, ils risquent de pas se croiser souvent... Premier sondage: quelle serait la taille idéale d'une carte d'un contient?
2. sous-carte (tuiles hexagonales, a terme - règle du jeu: 6 assaillants max par cible)
chaque sous-carte représente théoriquement 1km²... soit 1000*1000 cases. Je peux stocker la carte en bdd, pour chaque sous-carte... et hop, j'explose le serveur OVH avant meme de créer un perso (notez que c'est déjà fait avec la carte avant)
Bref: les sous-cartes se génèrent auto à l'entrée d'un perso (si pas déjà existante en bdd) et se désintègrent au départ du dernier (compteur sur le nombre de perso présent sur la carte). Je dois la générer... aléatoirement, mais reproductible, donc pas aléatoire ^^
Là, fonction maison: Je découpe chaque carré (carte) en 9 carrés plus petits. suivant X et Y du continent (+ une variable diff pour chaque case), je fais un modulo pour chacune des 9 cases (sera tjs le meme) => je récupère dans la BDD une portion de terrain de 250*250 cases pour chaque. Là dessus, je repasse deux couches: une pour les routes, et l'autre pour la flotte (pas encore au point, mais c'est l'idée)
bref: je stocke donc ce résultat en bdd pour le perso... et je désintègre le tout dès que possible.
Sauf que 652500 enregistrements, par sous-carte, ca me plait pas... je cherche à stocker ca différement. (notez que chaque enregistrement se trimballe un ID de lien avec la position de la carte continent... je remet pas le X, Y, Z du contient dans chaque, trop lourd. structure: ID, X, Y, Image)
là-dessus, je récupère les persos, les monstres (générés avec la carte) et les objets (objets, pas décors(arbres, rochers, maisons...))
Pour les décors, je fais aussi une magouille: un ID par case... si c'est un sol, no prob. (pas de décor sur la case), si c'est un décor, je récupère le dernier sol utilisé)(oui, la première case sera donc tjs un sol)
CE QUE JE CHERCHE:
puis-je me passer du stockage en bdd?
oui, certainement... je passe par des fichiers sur le serveur (cool, pas d'accès a la bdd)...
XML - serveur?
vais devoir ouvrir a chaque mouvement le fichier sur le serveur (562500 enregistrements, hein - ca tient sur +- 600Ko d'apres mes tests en "xml" perso), charger tout en mémoire pour aller lire les 50-100 cases qu'il me faut. ca me parait lourd.
XML - client?
Envoyer le fichier au navigateur, et le stocker sur le HD du joueur? (est-ce possible? comment récupérer les données? javascript? - + problème: les joueurs pourraient aller chercher/modifier le fichier (voir/modifier la carte donc, rien d'autre)
Enfin, voilà... J'expose un truc qui m'embete depuis un bon bout de temps, pour lequel j'ai une solution, mais je cherche mieux.
Grand merci à ceux qui se pencheront sur ce cas spécial.
(oui, d'habitude, c'est plutot 200*200 cases, j'ai l'impression, pour une seule map)
Ruz, cartographe cinglé
attendez, je cherche...