Je fais un jeu stylisé low poly. J'ai un terrain avec de l'eau et je veux beaucoup, beaucoup d'arbres; J'ai 10 000 arbres placés en masse pour le moment. Chaque arbre ne comprend pas plus de 200 triangles, donc ils ne sont pas trop imposants.
Le principal problème est qu'il y a des lacs et que les lacs sont assez grands. Vous ne pouvez pas vraiment voir d'arbres de l'autre côté du lac, et cela semble vraiment mauvais, surtout lorsque vous y marchez et que des arbres apparaissent soudainement.
Pour résoudre ce problème, je dois augmenter la distance entre les arbres afin que vous puissiez voir une quantité décente d'arbres de l'autre côté du lac, mais cela réduit les performances à 40-50fps, et il n'y a presque rien d'autre dans le jeu pour l'instant. J'utilise une GTX 1080, si cela aide.
Que puis-je faire pour accélérer le jeu avec plus d'arbres?
la source
Réponses:
Vous pouvez effectuer plusieurs actions pour augmenter les performances de dessin.
Vous avez dit qu'ils étaient assez loin. Vous pouvez utiliser LOD pour diminuer le nombre de sommets de ces arbres, et ainsi diminuer le temps nécessaire pour parcourir tous les sommets en cours de tracé. Même si ce n'est probablement pas le problème à portée de main (GTX1080 avec seulement 10k arbres avec 200 tris chacun, des nombres chétifs pour le GPU), je l'ai toujours inclus. Le panneau d'affichage est un outil efficace pour le niveau de LOD le plus bas, car il s'agit essentiellement d'un plan plat toujours face à la caméra avec une image rendue de l'arbre. Il perd le sens de la profondeur, c'est pourquoi il est bon pour le niveau le plus bas car le joueur ne remarquera probablement pas la différence.
Avez-vous activé le traitement par lots ? La mise en lot dynamique est généralement effectuée automatiquement si le nombre de sommets des mailles est assez faible. Le traitement par lots statique peut également être essayé en rendant les arbres statiques en cochant la case dans l'éditeur d'unité sur l'objet de jeu parent. Cela ne fonctionne pas bien avec les objets animés. Vous avez besoin que les objets partagent du matériel pour que cela fonctionne.
Le traitement par lots personnalisé vous permet de contrôler le rendu en générant vous-même les blocs au lieu de laisser l'unité le gérer, et il permet également le traitement par lots pour les maillages plus volumineux. Cela se fait facilement par Mesh.CombineMeshes . Cela ne fonctionne pas non plus correctement avec les objets animés. Vous avez besoin que les objets partagent du matériel pour que cela fonctionne. Vous voulez probablement diviser votre monde en une sorte de morceaux et en créer des lots. La façon dont ces morceaux doivent être générés dépend vraiment de la façon dont votre caméra se déplace dans le monde.
Activez l' instanciation sur les shaders. L'instanciation permet au moteur de dessiner plusieurs objets (avec le même maillage) avec un seul appel de dessin. Pour que cela fonctionne, les objets doivent avoir un maillage partagé et un shader partagé. Le matériau peut varier, mais le shader doit supporter toutes les différentes propriétés variables.
Pour que le moteur crée mieux des lots de rendu instanciés, vous souhaiterez probablement regrouper les mêmes maillages dans la scène. Jouer également avec la file d'attente de rendu des matériaux vous donnera de bons résultats si un maillage a toujours le même matériau. Pendant le développement du jeu mobile sur lequel je travaille actuellement, je l'ai utilisé pour réduire de plus de moitié les appels dans ma scène de test. Aussi depuis Unity 5.6 assurez-vous de cocher la
Enable Instancing
case dans le matériau.Gardez vos appels et vos appels SetPass en général. Ce sont les appels bruts pour que votre GPU dessine des trucs, et ils ont une surcharge importante. La réduction des appels (ce que font le traitement par lots et l'instanciation) augmentera les performances globales de votre processeur, car il est nécessaire de faire beaucoup moins d'attente. Les appels SetPass sont des modifications apportées à vos shaders actuels, donc si vous avez de nombreux matériaux différents, vous aurez plusieurs appels SetPass, qui font également attendre le processeur un peu.
Si votre scène est énorme et que votre temps processeur passe à parcourir tous les objets de la scène, essayez de réduire les objets de la scène. Regroupez certains arbres au lieu de les placer de manière individuelle et disposez-les comme un seul objet. Assurez-vous également que vous ne déplacez pas les arbres ou les objets parents, car cela oblige Unity à supprimer les transformations mises en cache et à recalculer l'arborescence de la scène entière.
Si votre scène est énorme et que votre temps processeur va toujours principalement à Unity parcourant l'arborescence de la scène pour créer des listes pour rendre tous les objets, une chose que vous pourriez faire est de ne pas laisser Unity gérer le rendu. Si vous avez une meilleure façon de suivre les objets dessinables, vous pouvez utiliser CommandBuffer.DrawMeshInstanced ou Graphics.DrawMeshInstanced pour les dessiner à la main. Je n'entrerai pas dans les détails à ce sujet, car il est beaucoup plus avancé et implique l'élimination des objets vous-même et ainsi de suite.
Dans le cas où le traitement par lots statique ou dynamique ne fonctionne pas correctement (ce que vous pouvez voir en vérifiant le débogueur de trame), vous devez vous assurer que vous utilisez bien du matériel partagé et ne faites pas de copies du matériel par accident lors de l'appel
meshRenderer.material
. Appeler le.material
fera des copies de vos documents et rompra le traitement par lots. Utilisez.sharedMaterial
plutôt.Depuis Unity 5.6, vous pouvez utiliser le débogueur de trames pour déterminer pourquoi certains appels ne sont pas groupés avec les appels précédents. Cela sera très utile tout en essayant de réduire les appels de votre jeu.
L'instanciation présente les avantages suivants par rapport au traitement par lots statique / dynamique / personnalisé:
De plus, il s'agit plutôt d'une nouveauté dans Unity et peut-être un peu instable. De plus, les GPU des appareils plus anciens ou mobiles ne prennent pas nécessairement en charge l'instanciation.
la source
Ok, donc le problème était simplement que je n'utilisais pas de GI en temps réel pré-calculé. Je l'ai vérifié il y a un petit moment, mais cela n'a pas eu d'effet immédiat, je l'ai donc laissé et oublié, et le temps de traitement de l'éclairage était si long aussi. Cependant, il vient de terminer le traitement, et ma parole, mon fps a augmenté de 3 fois. Donc pour l'instant, je vais en rester là et à l'avenir, assurez-vous que j'utilise toujours GI en temps réel pré-ordinateur!
S'il y a encore quelque chose que je pourrais faire pour améliorer davantage les performances, faites-le moi savoir, je vous en serais très reconnaissant!
la source