34 votes

Optimisation de jMonkey similaire à celle de Java3D

Edit : Pour avoir un dessin en temps réel, j'ai commencé à utiliser lwjgl qui est la base de jmonkeyengine et jocl dans une "interopérabilité" entre opengl et opencl, maintenant je peux calculer et dessiner 100k particules en temps réel. Peut-être que la version mantle de jmonkeyengine pourra résoudre ce problème de drawcall overhead.

Depuis plusieurs jours, je me suis familiarisé avec le moteur jMonkey (ver:3.0) dans Eclipse (java 64 bit) et j'essaie d'optimiser une scène en utilisant GeometryBatchFactory.optimize(rootNode); commandement.

Sans optimisation (avec possibilité de changer la position des sphères) :

enter image description here

Ok, seulement 1-fps provient à la fois de la bande passante du pci-express et de l'overhead du jvm.

Avec optimisation (sans possibilité de changer la position des sphères) :

enter image description here

Maintenant, c'est 29 fps même avec un nombre de triangles plus élevé.

Java3D avait un setCapability() qui fait qu'un objet de la scène peut être lu/écrit même sous une forme optimisée. Le moteur jMonkey 3.0 doit être capable de ce sujet mais je n'en ai trouvé aucune trace (j'ai cherché des tutoriels et des exemples, sans succès).

Question : Comment puis-je régler read/write position/rotation/scale capacités de optimized nœuds d'une scène dans jMonkey 3.0 ? Si vous ne pouvez pas répondre à la première question, pouvez-vous me dire pourquoi le nombre de triangles augmente lorsque j'utilise la commande d'optimisation ? Dois-je créer une nouvelle méthode pour accéder à la carte graphique et changer les variables moi-même (jogl peut-être ?)?

Informations sur la scène : 16k particules(sphères de 16x16 res) + 1 point light(et son ombre de 4096 resolution).

Je suis sûr qu'on peut envoyer plusieurs milliers de nombres flottants en une milliseconde par pci-express avec facilité.

  • Informations supplémentaires : J'utilise des noyaux Aparapi pour mettre à jour les positions des particules. particules, ce qui prend 10 millisecondes(16k * 16k interactions pour (cela ne change rien dans le mode optimisé :( ) Est-ce qu'aparapi peut accéder à ces données optimisées ?

Pour le cas de batchNode.batch(); optimisation, voici à nouveau 1 fps avec des nombres d'objets réduits :

enter image description here

Le nombre d'objets n'est plus que de quelques centaines mais les fps sont toujours à 1 !

Envoyer seulement les positions de la sphère au gpu et le laisser calculer les positions des vertex pourrait être mieux que de calculer les vertex sur le cpu et d'envoyer des données énormes au gpu.

Personne pour vous aider ? J'ai déjà essayé batchNode mais cela n'a pas aidé suffisamment.

Je ne veux pas changer l'api 3d car les gens de jMonkey ont déjà réinventé la roue et je suis satisfait de la situation actuelle. J'essaie juste d'obtenir un peu plus de performances (l'annulation des ombres donne une vitesse de 100 %, mais la qualité est importante aussi !)

Ce programme java deviendra un simulateur de scène d'impact d'astéroïde (il y aura le choix de la taille, de la masse, de la vitesse, de l'angle de l'astéroïde) avec l'algorithme marching-cubes avec LOD (il y aura des millions de particules).

L'algorithme Marching-cubes diminuerait considérablement le nombre de triangles. Si vous ne pouvez pas répondre à la question, tout algorithme de marching-cubes (ou tout algorithme de coque convexe O(n)) pour java sera accepté ! Données : tableaux x, y, z comme source et tableau de bandes triangulaires comme cible (points de maillage d'iso-surface).

Merci.

Voici quelques échantillons du flux (avec une résolution beaucoup plus faible) :

1) Effondrement d'un groupe de roches en forme de cube par gravitation : enter image description here

2) La force d'exclusion commence à se manifester : enter image description here

3) La force d'exclusion et la gravitation donnent au groupe une forme plus lisse : enter image description here

4)Le groupe forme une sphère (comme prévu) : enter image description here

5)Puis, un grand corps stellaire s'approche : enter image description here

6)Sur le point de toucher : enter image description here

7) Le moment de l'impact : enter image description here

Avec l'aide de l'algorithme de Barnes-Hutt et un potentiel tronqué, le nombre de particules sera 10x(peut-être 100x) plus élevé.

Plutôt que l'algorithme Marching-Cubes, un tissu fantôme qui enveloppe le corps humain peut donner une coque à basse résolution (plus facile que BH mais nécessitant plus de calculs).

Le tissu fantôme sera affecté par nbody (gravité + exclusion) mais nbody ne sera pas affecté par le tissu qui l'enveloppe. Nbody ne sera pas rendu mais le tissu sera rendu avec un nombre de triangles inférieur.

enter image description hereenter image description here

Si MC ou plus fonctionne, cela permettra au programme de rendre une toile d'emballage pour ~200x plus de particules.

4voto

msj121 Points 913

Vraiment désolé....

Vous pouvez mettre en lot toutes les géométries d'une scène (ou d'un sous-noeud) qui reste statique .

La mise en lot signifie que toutes les géométries ayant le même matériau sont combinées en un seul maillage. Cette optimisation n'a d'effet que si vous n'utilisez que peu de matériaux (jusqu'à 32 en gros) au total. La contrepartie est que le batching prend plus de temps lors de l'initialisation du jeu.

Le changement dans les triangles est donc dû au fait qu'ils ont tous été assemblés en un seul mesh..... La seule suggestion, si cela est nécessaire, est d'essayer d'obtenir le maillage et de modifier les points sur celui-ci, mais à ce stade, je ne pense pas que cela ait un sens.

Essayez peut-être une autre méthode d'optimisation.

Bonne chance, je n'ai pas utilisé JMonkey depuis un moment, mais je suis heureux de voir que d'autres le font et que sa croissance continue !

EDIT

Un impact sur la terre n'affecterait probablement pas l'autre côté (à moins que la sphère ne soit pas la terre mais déjà un petit échantillon de la terre prise comme une sphère)...

Essayez peut-être une forme 2D comme surface d'impact, même si je sais que ce ne sera pas votre meilleur choix, cela pourrait vous donner une idée de l'effet du nombre de formes et de leur importance. Si c'est le cas, vous pourriez envisager de supprimer certaines des particules, sinon, ne vous inquiétez pas. Je suis presque sûr que ce sera le cas.

Enfin :

Peut-être ne pas effectuer le rendu en temps réel ? Prenez une minute pour dessiner les images dans un tampon puis jouez, le temps que vous jouiez vous aurez encore une quarantaine d'images etc... et peut-être qu'une trentaine de secondes suffiront.

4voto

Troy Alford Points 8676

Il existe une documentation assez solide dans le wiki de JMonkeyEngine qui explique en détail comment utiliser les transformations auxquelles vous faites référence, et qui se trouve ici : Concepts spatiaux avancés .

En outre, il y a beaucoup d'informations concernant les maillages et leur rendu que vous pouvez consulter ici : Maillages polygonaux .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X