Salut tout le monde
Alors, voilà je fais partie d'une petite équipe qui a pour projet de développer un jeu vidéo web qui serait une sorte de mix entre civilization et ogame dans un environnement du type "google map".
Le monde est basé sur un principe de base : il doit être réaliste.
On a donc des cartes qui vont faire à peu près la taille de l'europe, et les joueurs pourront à la façon d'un googlemap zoomer pour admirer une cité en gros plan ou au contraire dézoomer à mort pour avoir une vision stratégique de l'ensemble du truc.
La question qui tue c'est comment implémenter ce genre de monde sans faire n'importe quoi ?
Pour l'instant on est parti sur ça :
- Moteur à la google map pour afficher la carte (le client envoie un emplacement X,Y, un niveau de zoom, la résolution du client, et le serveur nous donne l'url des quelques images à télécharger pour rendre la scène)
- Ensuite on ajoute une couche logicielle au dessus de la gestion de la map pour afficher dessus les éléments du gameplay : maisons, troupes, arbres, etc.
Je dirais que le point 1) ne pose pas de soucis, moults sites et APIs existant sur le sujet. La seule condition c'est d'avoir un serveur avec suffisamment de BP pour envoyer les images aux clients.
Le point 2) quant à lui est beaucoup plus problématique, je vais vous expliquer pourquoi :
On a un monde qui se veut "réaliste" et permet donc au niveau de zoom maximal d'avoir des cases de 60pixels de large par exemple qui vont représenter 10 mètres. La plus petite case fait donc 10m*10m, ce qui va correspondre à un tronçon de route par exemple.
Par contre au niveau de DéZoom maximal, les mêmes 60pixels vont correspondre à 65km. (jusque là tout va bien, c'est ce qu'on demande à un dezoom).
Pour créer une case du monde on utilise un tile BMP de 15,000 pixels de côté qu'un logiciel spécial va découper en pleins de petites images de 60px*60px à différents niveaux de zoom.
Le premier truc à savoir c'est que sur ce tile, 60pixels = 270m. (on va pas non plus demander aux graphistes de dessiner chaque caillou de la planète à la main ^^).
Donc en fait on va extrapoler des niveaux de zooms supplémentaires à partir de là, jusqu'à obtenir une case finale de 60px<=>10m. Bien entendu les derniers niveaux de zoom seront un peu pixellisés comme sur gmap sur les zoom maxis.
Voilà maintenant l'équation qui m'amène à vous (si vous êtes encore là, merci ) :
1 monde = 6500km * 6500km
1 monde = 100 tiles * 100 tiles
1 tile = 60,000 sous cases type A de 60px de côtés (=270m)
1 sous-case type A = 27*27 sous-sous-cases de type B (=10m)
1 monde = 437,400,000,000 de petites cases type B
Sachant que les seules coordonnées X,Y gérées par le moteur sont celles des cases du type B. Les autres cases n'existent pas vraiment c'est plus pour avoir un repère au niveau de l'échelle.
Une monde est donc constitué de plusieurs JPG qui représentent le "fond du paysage" auquel va se superposer une grille de 437 milliards de cases type B qui vont servir à placer les bâtiments des cités, les bonhommes, les ressources, etc.
Plusieurs questions :
- Vous semble-t-il tout simplement envisageable de trouver une solution acceptable pour gérer ça ?
- Peut-on envisager un recours à méga datastore type cloud (donc utiliser mes serveurs web pour le front / le gameplay et un service hébergé pour les data) pour résoudre le problème d'une base de données gargantuesque ?
- Le fait de ne pas avoir 400 milliars de cases pré enregistrées en base mais plutôt d'y sauver uniquement les objets gameplay existant (avec des coordonnées X,Y) ne permet-il pas de dire qu'il s'agit d'un faux problème ?
Là je me dis un peu que c'est pas tant la quantité brute de données stockées qui compte mais plutôt la quantité de données qu'on va s'amuser à sortir à chaque seconde. Mais j'ai du mal à imaginer comment se passerait une requête sur une table comprenenant des milliards d'enregistrement (et là les mecs qui ont bossé dans des banques doivent peut être pouvoir m'éclairer).
A l'heure actuelle je me dis qu'il suffit de demander au serveur tous les objets compris entre le Xmin, Xmax et Ymin,Ymax actuellement visibles sur l'écran du joueur. Mais avec des millions d'éléments de gameplay par carte, j'ai peur que la latence devienne problématique.
Bref, je sais aussi que le modèle du tile de 15,000pixels pour 65km découpé en sous tiles de 60pixels pour 270m eux même redécoupés pour arriver à 10m n'est peut être pas idéal. Mais faut-il ajuster des nombres en entrée pour transformer un 400 milliards en 1 milliard ou faut-il complètement changer de philosophie ?!
Un grand merci à ceux qui m'auront suivi et ceux qui prendront le temps de me répondre
A bientôt
PS : il convient d'ajouter qu'à cela s'ajoute le problème du "dezoom" : de loin on ne va pas afficher chaque objet, car le joueur ne peut pas les voir. Mais il y aura des icônes stratégiques et il faut bien savoir ce qu'il y a en dessous pour mettre une icône... Comment ne pas interroger des millions de cases en même temps juste pour savoir qu'il ne faut rien afficher... ? Par exemple en dessous de 10,000 hommes au km² dans une armée je n'affiche rien, mais au dessus de ce nombre j'affiche une icône sur la carte qui représente cette armée.
Partager