Question

Je développe un jeu pour le Web. La carte de ce jeu fera au minimum 2 000 km sur 2 000 km. Je veux pouvoir encoder l'altitude et le type de terrain à un niveau de granularité - 100m X 100m par exemple.

Pour une carte de 2 000 km sur 2 000 km stockant ces informations dans des compartiments de 100 m 2 , cela signifierait 20000 par 20000 éléments ou un total de 400 000 000 enregistrements dans une base de données.

Existe-t-il un autre moyen de stocker ce type d'informations?

Plus d'informations

La carte elle-même ne sera jamais affichée dans son intégralité. Les unités seront déplacées sur la carte à tour de rôle et les joueurs recevront des informations sur leur emplacement et leur apparence. Le terrain dictera la vitesse et l’interdiction de mouvement.

Je suppose que j'essaie de dire que la carte sera utilisée pour le jeu et pas nécessairement à des fins graphiques ou d'affichage.

Était-ce utile?

La solution

Je le traiterais différemment, en séparant le type de terrain et l’altitude.

  1. Le type de terrain, je suppose, ne change pas aussi rapidement que l'altitude. Il existe probablement des secteurs du même type de terrain qui s'étendent bien plus longtemps que le niveau de granularité le plus bas. Je mapperais ces secteurs dans des enregistrements de base de données ou une sorte de table de hachage, en fonction des performances, de la mémoire et d'autres exigences.

  2. Je suppose que l’altitude est semi-continue, car elle change progressivement pour la plupart. Je voudrais essayer de mapper les valeurs dans un ensemble de fonctions continues (différents ensembles entre les parties qui ne continue pas, comme dans le changement brusque d'élévation). Pour tout ensemble de coordonnées pour lesquelles le terrain a la même altitude ou peut être décrit par une simple fonction, il vous suffit de définir la plage couverte par cette fonction. Cela devrait réduire considérablement la quantité d'informations à enregistrer pour décrire l'élévation de chaque point du terrain.

Donc, je diviserais la carte en différents secteurs composés de plages (x, y), une fois pour le type de terrain et une fois pour l’altitude du terrain, et créerais une table de hachage pour chaque élément pouvant renvoyer la valeur appropriée en fonction des besoins.

Autres conseils

Cela dépend de la façon dont vous voulez générer votre terrain. Par exemple, vous pouvez tout générer de manière procédurale (en utilisant l’interpolation d’une carte de terrain / hauteur basse résolution - stockée sous deux "bitmaps" - avec une interpolation aléatoire générée à partir des coordonnées xy afin d’assurer que le terrain ne se transforme pas), et une utilisation minimale. espace de rangement. Si vous souhaitez des zones de terrain complètement définies, vous pouvez les stocker séparément et les utiliser le cas échéant, en générant le reste de manière aléatoire.)

Si vous voulez un terrain entièrement défini, vous devrez vous pencher sur une technique de compression / diffusion pour tirer uniquement le terrain qui vous intéresse actuellement.

Si vous voulez le type de granularité que vous recherchez, il n'y a pas de moyen évident de le faire.

Vous pouvez essayer une transformation en ondelettes à 2 dimensions, mais c'est assez complexe. Quelque chose comme une transformation de Fourier ferait très bien. De plus, vous ne voudriez probablement pas stocker le terrain avec un enregistrement unique par morceau de terre; il est plus logique d'avoir une sorte de champ de base de données pouvant stocker une matrice codée.

Je pense que la solution habituelle consiste à diviser votre domaine en "tuiles". de tailles gérables. Vous devrez ajouter un peu de logique pour charger les tuiles appropriées à tout moment, mais pas trop mal.

Vous ne devriez pas avoir besoin d'accéder à toutes ces informations à la fois - même si chaque seau de 100 m2 occupait un seul pixel à l'écran, aucun écran à ma connaissance ne pouvait afficher 20k x 20k pixels à la fois.

De plus, je n’utiliserais pas de base de données, mais plutôt un mappage de haut en noir et en noir. image blanche dont les valeurs en pixels représentent des hauteurs.

Bonne chance!

Ce sera une mine d’informations, quelle que soit la façon dont vous la regardez. 400 000 000 cellules du réseau auront des conséquences néfastes.

Je vois deux façons de contourner ce problème. Premièrement, comme il s’agit d’un jeu basé sur le Web, vous pourrez peut-être obtenir un serveur avec un disque dur de taille décente et y stocker les 400 millions d’enregistrements comme vous le feriez normalement. Ou plus probablement, créez une sorte de votre propre mécanisme de stockage pour plus d’efficacité. Il vous suffira ensuite de trouver un moyen d'accéder efficacement aux données, ce qui pourrait être fait en tenant compte du fait que vous devrez sans doute les utiliser toutes en même temps. ;)

L’autre solution serait une sorte de compression. Vous devez cependant faire attention à cela. La plupart des algorithmes de compression prêts à l'emploi ne vous permettent pas de décompresser un emplacement arbitraire dans le flux. Peut-être que vos données de terrain contiennent des modèles que vous pouvez utiliser? Je doute que ce sera complètement aléatoire. Plus probablement, je prédis de grandes zones avec les mêmes données. Peut-être que ceux-ci peuvent être encodés comme tels?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top