Question

J'ai eu un moteur de moteur Voxel (basique) et un système d'eau qui a l'air (et je suppose essentiellement des œuvres) comme ceci: https://www.youtube.com/watch?v=Q_Tdegioots (pas mon jeu). de
Les valeurs d'eau sont stockées dans une gamme 3D de flotteurs et toutes les 0,05s calculent le débit d'eau en vérifiant le voxel ci-dessous et adjacents (Y-1, X-1, X + 1, Z-1, Z + 1) et ajoute la valeur. de
Ce système fonctionne bien (70 FPS) pour de petites quantités d'eau, mais lorsque je commence à calculer l'eau sur plus de 8 morceaux, cela devient trop. (J'ai désactivé toute création de rendu ou de maillage pour vérifier si c'est le goulot d'étranglement, ce n'est pas. Ses calculs de flux purement). de
Je ne suis pas un programmeur très expérimenté, je ne sais donc pas où commencer l'optimisation, à l'exception de la fabrication des calculs dans une coroutine comme je l'ai déjà fait. de
Dans ce message: https://gamedev.stackexchange.com/questions/ 55414 / Comment-définir-laferrée - Eau rempli - d'eau (près du bas) Boréal suggère de l'exécuter dans un strict de calcul de calcul . Est-ce la voie à suivre pour moi? Et comment irai-je une telle chose? de
Toute aide est très appréciée.

Était-ce utile?

La solution

Si vous calculez vraiment une simulation basée sur Voxel, vous développerez le nombre de calculs géométriquement à mesure que votre taille augmente, vous risquez de fonctionner rapidement sur le traitement des volumes plus importants.

Un shader de calcul est idéal pour effectuer des calculs massivement parallèles rapidement, bien que ce soit un paradigme de programmation très différent qui prend de l'habitude de s'habituer à. Un shader de calcul examinera le contenu d'un tampon (c.-à-d. Une «texture» pour les civils américains) et les faire très rapidement - dans votre cas, le tampon sera probablement un tampon / une texture dont les valeurs de pixels représentent des cellules d'eau. Si vous voulez faire quelque chose de très simple, comme les incréments de l'incrément de haut ou de bas, le shader de calcul utilise la puissance de traitement parallèle du GPU pour le faire vraiment rapidement.

La partie difficile est que GPU est optimisé pour le traitement parallèle . Cela signifie que vous ne pouvez pas écrire de code comme "texela.value += texelb.value" - sans travailler supplémentaire de votre part, chaque fragment du tampon est traité avec une connaissance nulle de ce qui se passe dans les autres fragments. Pour référencer d'autres texels, vous devez lire la texture à nouveau - certaines techniques lisent une texture plusieurs fois avec des décalages ( Cet exemple GL fait cela pour implémenter des BLUKS, d'autres le font en traitant de manière répétée une texture, en mettant le résultat dans une texture temporaire, puis de retraitement de cela.

au niveau de 10 000 pieds: Oui, un shader de calcul est un bon outil pour ce type de problème car il implique des tonnes de calcul similaire. Mais cela ne sera pas facile de faire de la batte. Si vous n'avez pas effectué de programmation de shader conventionnelle auparavant, vous voudrez peut-être examiner cela d'abord pour s'habituer à la voie du travail GPU. Même des outils vraiment essentiels (si, alors-autre ou des boucles) ont des implications et des utilisations de performances très différentes dans la programmation du GPU et il faut un certain temps pour obtenir votre tête autour des différences. A partir de cette écriture (1/10/13), il ressemble à Nvidia et UDACITÉ proposent une introduction à calculer Shader Course qui pourrait être un bon moyen de se mettre à la hauteur.

FWIW Vous avez également besoin d'un matériel assez moderne pour des shaders de calcul, ce qui peut limiter votre public.

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