[Wiki] Mapping : Optimiser les zones

Répondre
Partager Rechercher
Ce message est en mode wiki. Tous les comptes de plus de 30 jours avec plus de 30 messages peuvent le modifier.
Tutoriel qui regroupera les différentes astuces pour optimiser les zones. Si vous avez des questions, des suggestions, des critiques ou que vous avez d'autres astuces, j'ai ouvert ce topic . Bon y a différents trucs à savoir pour alléger au maximum les zones ou les optimiser sans que la beauté en pâtisse. Infos compilées dans le cadre de mon module avec des potes.

Myrdhin



Les temps de chargements et de calcul


Une personne qui s'est intéressée aux temps de chargements des zones remarquera rapidement qu'ils sont calqués sur le temps que met une zone pour "baker" ou se calculer. Et les temps de chargement de la campagne solo ne sont pas du tout significatifs des possibilités en terme d'optimisation.

Sans compter les rencontres, les éléments qui mettent le plus de temps à être calculés sont :


Le calcul d'une zone


Taille de la zone


C'est le premier élément qui entre en compte dans le temps de chargement d'une zone. Par exemple, une zone vide de 16*16 se chargera plus vite qu'une zone vide de 32*32.

- Une taille importante augmente le poids de la zone.


Relief de la zone


Le relief joue une part importante dans le calcul de la zone. Il vaut mieux éviter de créer une zone aux reliefs tortueux, et dessiner intelligemment l'aspect du terrain. Assombrir une texture lointaine vaut mieux que creuser un trou au même endroit. De même, agencer avec astuce des plaçables de décor permettra de tromper l'oeil assez facilement.

- Trop de différences dans le relief augmentent le poids de la zone.


Le maillage de surface accessible (walkmesh)


C'est la surface sur laquelle un joueur peut se déplacer librement. Elle joue sur le poids global mais pas de manière significative. Le problème, c'est qu'il peut se glisser dans des endroits où le joueur n'ira jamais (car bloqué par un décor, ou simplement séparé par une partie non-accessible). Ces informations occupent alors de la place inutilement.

Il faut bien prendre garde à nettoyer une zone lorsqu'elle est terminée, car c'est l'élément qui joue le plus sur les fichier TRX. Par conséquent, il joue également sur le fichier PWC que les joueurs devront télécharger. L'idéal est d'utiliser le pinceau d'accessibilité et supprimer les zones théoriquement inaccessibles.

- Une surface accessible plus importante augmente le poids de la zone.


L'insersion des plaçables (stitching) :


Il s'agit de la validation des plaçables dans le maillage de surface accessible de la zone, et qui en résulte la modification de ce maillage.

La vitesse de ce calcul dépend bien évidemment de la taille de la zone. Dans une zone 8*8, l'insersion de 10 plaçables sera plus rapide que pour ces 10 mêmes plaçables dans une zone 24*24.

Mais le temps de calcul étant étroitement lié à l'insersion des plaçables, la taille de la zone est de moindre importance en comparaison. Admettons qu'une zone de 16*16 contienne 10 plaçables, et qu'une autre zone de 8*8 en contienne 100. Le temps de chargement de la zone 8*8 devient plus important, et peut même dépasser celui de la zone 16*16. Le temps de calcul global augmentera donc également, ainsi que le temps de chargement en jeu.

- Une modification trop importante du maillage de surface augmente le poids de la zone.

L'herbe :


C'est le fléau et sans doute l'élément le plus lourd des zones tout en étant une des causes majeurs de lags. Mais c'est un élément qui embellit les zones. Par contre elle affecte beaucoup moins le temps de chargement que les plaçables.

Pour info, chaque mégatile (les carrés noirs) peut contenir une quantité limitée d'herbe qui correspond à peu près à 1/10 de sa surface, ce qui n'est pas énorme (voir le screen). Et ça pèse 1.3 mo.

[(image : herbe)]

Maintenant, je sais pas si la taille de l'herbe affecte le poids. Je ferai des tests quand j'en aurai envie. Donc l'idéal est d'éviter de placer l'herbe dans les éléments de base d'une zone. Elle doit être la robe, le petit truc de fin qui va donner le cachet. A user avec modération donc.

En général, sur les zones que j'ai vues, l'herbe est utilisée pour donner plus de fraicheur à une texture qui est assez pauvre à la base d'où la nécessite de l'embellir. Pour limiter l'herbe il faut jouer sur la texture en donnant beaucoup de nuances, l'herbe deviendra donc moins essentielle mais surtout la petite touche de fin. Par exemple ces deux zones :

[(image : jet)] [(image : nwn2ss020307042438)]


Le poids total d'herbe est très léger malgré les apparences. Ce sont des coups de pinceau très léger (très peu dense) avec l'herbe combiné avec un mélange de texure et de couleur très diversié pour casser l'utilité de l'herbe. Je peux encore réduire de double la quantité d'herbe de cette zone sans qu'elle perde en qualité.


Les plaçables et les objets environnementaux


On peut arriver avec un module qui comporte quasi 0 plaçable. (tout dépend bien sur des plaçables) et l'époque où le calcul des zones prenait du temps pourrait être révolu

Pourtant la plupart ne pèse pas trois tonnes mais il y a une astuce qui, si répétées minutisement permettra un gain énorme sur deux plans :

- le poids de zones (gain léger)
- le temps de chargement (gain très important)

Si on clique avec le bouton droit de la souris, on remarque qu'on peut passer un plaçable en "PLaçables à éléments d'environnement (PEE)". Le plaçable perd son dynamisme et donc son poids mais aussi sa prise en compte dans les temps de chargements ou sur la grille de walkmesh.

[(image : objetsdenvironnements)]

Tous les types de plaçables peuvent être convertis mais je les distingue en deux catégories puisqu'il y a une petite astuce pour même rendre les plaçables dynamiques en "Objets environnementaux".

Plaçables simples


Il s'agit des plaçables sans élément secondaire rattaché (comme les portes).

De manière générale, les plaçables convertis deviennent traversables et non cliquables comme s'ils ne faisaient qu'un avec le terrain. Ils perdent la quasi totalité de leur poids. Un amas de rocher (petit plaçable) qui pèse 20ko à l'origine passe à 1ko. de leur poids mais le walkmesh qui passe en dessous fait contrepoids. Donc là a deux possibilités pour vire le walkmesh et rendre par la même le plaçable non traversable :

1-On prend le trigger "rogner walkmesh". C'est précis mais ça ajouté un élément trigger et donc un petit peu de ko sur la zone

[(image : rogner)]

2-On utilise la fonction de terrain de base "inacessible". L'avantage c'est que ça pèse rien mais c'est moins précis puisque basé sur les triangles de base. L'idéal c'est de légèrement déplacer ses plaçables pour qu'ils s'alignent bien sur les triangles de walkmesh.

[(image : walk)]

Je préfère évidemment la seconde solution qui est vraiment la plus efficace mais j'utilise toujours la première quand le rognage a vraiment besoin d'être précis.

Plaçables type maison avec porte


On remarque vite fait qu'en les convertissant, la porte disparait et que donc, il perdent leur utilité puisqu'on ne peut plus rentrer dedans. Or les portes sont des éléments indépendants qui peuvent être utilisés sans être rattachés aux plaçables. Donc il faut procéder ainsi :

  1. Sélectionner la porte et sauver sa valeur absolue (copier ou Ctrl+C). C'est dans les propriétés de l'objet.
  2. Détacher la porte du plaçable.
  3. Sélectionner le plaçable et convertissez le.
  4. Sélectionner la porte et entrer son ancienne valeur absolue.

Elle retournera à son endroit initial donc bien dans l'entrebaillement.

Le tour est joué. Il vous reste à vous débrouiller pour virer le walkmesh en dessous comme expliqué plus haut. Il existe une méthode bourrin pour ça, c'est de calculer d'abord avec les plaçables en dynamiques (cad non convertis) pour l'ordi effectue lui même le lavage et ensuite passer tout en environnemtal puis sauver. Méthode rapide mais pour les plus rigoureux elle n'est pas aussi efficace que le tout fait à la main.


L'eau


Après avoir échangé avec Tanita, j'ai appris que l'eau remplissait un mégatile (carré noir) au moindre coup de pinceau mais que la partie non peinte devenait automatiquement invisible. Donc peu importe qu'un mégatile soit rempli ou non, il faut surtout faire attention à ne pas déborder d'un millimètre sur un autre mégatile si cela n'est pas utile.

4 mégatiles d'eau (donc 4 carrés noirs ou la surface marchable d'une 8 * 8) = 700ko empli ou non, la seule présence d'eau fait atteindre ce chiffre.

[(image : eau4)]


Taille optimale des zones


Bordure de zone et gaspillage


Voyons quelle est la place occupée par la bordure, surface de décor que le joueur ne pourra jamais parcourir. Celle-ci a une épaisseur de 8 tiles, quoi qu'il advienne. Pour connaître la superficie qu'occupe la bordure, voici un calcul simple :

[ (largeur utilisable + 16) x (longueur utilisable + 16) ] - surface utilisable

  • Très petite (4 x 4) : 16 tiles utilisables. Bordure : [(4 + 16) x (4 + 16)] - 16 = 384 tiles de bordure, soit 24 fois la surface utilisable (total : 400 tiles).
  • Petite (8 x 8) : 64 tiles utilisables. Bordure : [(8 + 16) x (8 + 16)] - 64 = 512 tiles de bordure, soit 8 fois la surface utilisable (total : 576 tiles).
  • Moyenne (16 x 16) : 256 tiles utilisables. Bordure : [(16 + 16) x (16 + 16)] - 256 = 768 tiles de bordure, soit 3 fois la surface utilisable (total 1024 tiles).
  • Grande (24 x 24) : 576 tiles utilisables. Bordure : [(24 + 16) x (24 + 16)] - 576 = 1024 tiles de bordure, soit 1.78 fois la surface utilisable (total 1600 tiles).
  • Très grande (32 x 32) : 1024 tiles utilisables. Bordure : [(32 + 16) x (32 + 16)] - 1024 = 1280 tiles de bordure, soit 1.25 fois la surface utilisable (total 2304 tiles).

Poids des zones

(source nwn2.fr)

On pourrait considérer qu'un tile occupe environ 12 Ko.

  • Très petite : 400 tiles dont 16 utilisables, soit 4.8 Mo au total.
  • Petite : 576 tiles dont 64 utilisables, soit 6.9 Mo au total.
  • Moyenne : 1034 tiles dont 256 utilisables, soit 12,3 Mo au total.
  • Grande : 1600 tiles dont 576 utilisables, soit 19.3 Mo au total.
  • Très grande : 2304 tiles dont 1024 utilisables, soit 27.8 Mo au total.

Conclusion


Mieux vaut donc utiliser une seule zone plus grande, plutôt que plusieurs petite offrant le même espace utilisable.

Comparons seize zones 4 x 4, quatre zones 8 x 8, et une zone 16 x 16. L'économie de poids et d'espace est flagrante :

  • Seize zones 4 x 4 :
    • 256 tiles utilisables
    • 6144 tiles de bordure "gaspillés"
    • 76,8 Mo d'espace occupé

  • Quatre zones 8 x 8 :
    • 256 tiles utilisables
    • 2048 tiles de bordure "gaspillés"
    • 27.6 Mo d'espace occupé

  • Une zone 16 x 16 :
    • 256 tiles utilisables
    • 768 tiles de bordure "gaspillés"
    • 12,3 Mo d'espace occupé


Les Rencontres


C'est un des éléments si ce n'est l'élément qui fait le plus augmenter les temps de chargement si on ne prend pas la peine de comprendre son fonctionnement.

Si vous mettez une rencontre telle quelle sans rien faire de plus, le moteur va mettre un temps considérable à charger les mobs/PNJs et plus vous augmenterez le nombre de rencontres et/ou le type de créatures, plus le temps de chargement sera important.

Obsidian a intégré une fonctionnalité pour pallier à cela. C'est le cache créature. Vous la trouverez dans les propriétés de la zone.

[(image : cachecreature)]

On peut dire que la zone pré-enregistre les mobs à spawner et que le temps de latence lors des chargements est ainsi éviter.


Optimisation module multi : Tanita's StripEase


Pour les modules multis, on peut pousser encore beaucoup plus loin l'optmisation et ainsi dépasser les limites "offficielles". Tanita a créé une fonctionnalité qui génère une version optimisée des modules en supprimmant tout ce dont le serveur n'a pas besoin (herbe, eau, terrain...bref presque tout).

Elle a intégré cette fonctionnalité à son Plugin : http://nwvault.ign.com/View.php?view...id=100372&id=9 . Mon module est par exemple passé de 700mo à 50mo, toutefois il faut prévoir une utilisation supérieure par le serveur puisque le Walkmesh est compressé à l'origine. Les chiffres approximatifs de consommation sont donnés par Tanita après que l'opération de Strip ait été effectuée.
Dernières modifications :
(Voir) 09/7/2009 13:47:24 : Deyonara (Réorganisation : le poids de la zone)
(Voir) (Comparer)04/4/2009 00:29:39 : Deyonara (Petite erreur corrigée)
(Voir) (Comparer)08/12/2007 00:51:13 : Deyonara (Mise en forme... pff de bouton...)
C'est mis en persistant. Merci pour cet apport non négligeable. Tu peux aussi le passer en wiki (remplace tuto par wiki entre [] ). Tu aura accès à des balises auto et à l'hébergement de tes images sur JoL.
merci beaucoup pour ce tuto
juste une ou deux précisisons...

Citation :
Détacher la porte du plaçable
qu'est ce que tu entend par là ?

Citation :
4 zones 4x4 ça donnerait donc 4,8 mo x4= 18,4 mo (sans compter l'herbe et l'eau pour chaque zone!)
1 zone 16x16 qui contient ces 4 zones on arrive à 12,3 mo.
On sauve déja 33% et ça c'est sans compter l'herbe et l'eau!!!
je ne suis pas tout à fait d'accord avec ça car j'ai l'impression que ça vaut dire qu'il vaut mieux faire une carte 16x16 que 4 zones 4x4. Je comprend par rapport à la taille globale du module mais par rapport au temps de chargement des maps pour le joueur ce serait vrai si systématiquement le joueur devait parcourir les 4 maps 4x4. Hors à mon avis il a plus souvent besoin de n'aller que sur une des 4 parties donc pas forcément besoin de charger les 12.3 Mo. Donc c'est plus une affaire de compromis entre taille du module et temps de chargement au moment du changement de map . Me trompe je ou non ?
Citation :
qu'est ce que tu entend par là ?
En fait quand tu convertis ton objet en "Plaçables à éléments d'environnements", la porte disparait automatiquement donc sauf si tu ne veux pas entrer dans ton bâtiment, il y a un petit problème.

Maintenant, si tu prends une nouvelle porte pour remplacer la disparu, bah elle ne se place pas automatiquement dans l'entrebaillement (puisque le plaçable n'a plus de zone de collision) donc c une grosse perte de temps.

L'astuce c'est de séparer la porte du plaçable initial et de la détacher. Ensuite tu convertis le plaçable et la porte ne disparaitra pas. Avant ça tu copies la position de la porte et une fois le plaçable convertis, tu colles l'ancienne valeur pour que la porte revienne dans l'entrabaillement.

Tout ça c une histoire de gain de temps pour pas que l'optimisation devienne un calvaire

Citation :
Donc c'est plus une affaire de compromis entre taille du module et temps de chargement au moment du changement de map . Me trompe je ou non ?
si on suit le tuto pour l'optimisation, une zone se chargera très vite. Donc oui je suis d'accord si tu prends pas la peine d'optimiser mais si tu le fais, un tps de chargement pour une 16*16 sera insignifiant (enfin par rapport à ce qu'on a l'habitude de voir)

Parceque quand tu regardes les temps de chargements de la campagne solo , tu te demandes ce qu'Obsidian a foutu mais on peut parvenir à des résultats bien meilleurs sans perdre en qualité.
Ok, le mieux c'est de positionner les images en utilisant la fonction du wiki de JoL. Comme ça, c'est Jol qui hébergera et à moins d'un cataclysme informatique localisé ou étendu, elles ne devraient pas disparaître.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés