Dans la
dernière partie, nous avons parlé de la naissance de KOMPAS-3D v18, quelque chose sur la sélection de critères et de modèles pour tester de nouvelles fonctions, et avons également abordé le sujet du rendu dans la version «Basic».
Continuons avec l'histoire de l'option de rendu «Amélioré».
Appeler des appels
Alexander Tulup, programmeur:
«Le principal problème des performances d'affichage de grandes scènes est associé à un grand nombre de soi-disant« appels de dessin ». L'ancienne version du rendu est construite au-dessus du modèle de données mathématiques. Ainsi, pour chaque primitive - points, arêtes, faces - une méthode distincte a été appelée pour son affichage.
Pour chaque appel de tirage, OpenGL (pilote) effectue une série de vérifications, traduisant simultanément les commandes entrantes dans un format compréhensible pour la carte vidéo, après quoi les appels sont ajoutés à la file d'attente et sont déjà exécutés.

Schéma de transfert de commande GPU dans OpenGL ( source )
Avec un grand nombre de détails, le nombre d'appels au CPU augmente tellement que les données n'ont tout simplement pas le temps d'arriver sur la carte vidéo. Nous obtenons une situation où sur une carte vidéo très forte, elle "ralentit" de la même manière que sur une carte moyenne ou plus faible.
Vous pouvez y faire face en réduisant le nombre de rendus (transitions d'états) - regrouper par matériau, combiner une géométrie commune ( instanciation ), etc.
N'oublions pas que de toute la scène, nous n'en voyons qu'une partie. Des algorithmes de détection d'objets invisibles sont applicables ici (abattage tronconique, abattage d'occlusion, etc.)
Inspirés par l'exemple de The Road to One Million Draws et AZDO , nous avons décidé d'emprunter une voie assez inhabituelle: se débarrasser autant que possible des changements d'état côté CPU. Maintenant, presque tout est fait sur la carte graphique. Tous les attributs nécessaires sont directement extraits de la mémoire vidéo tout en puisant dans le shader lui-même ( shader ), ce qui a été rendu possible grâce à l'augmentation de la mémoire vidéo ( VRAM ) et à l'avènement du SSBO .

1000000 de dés
Parmi les avantages de cette approche: la vitesse d'affichage est devenue très élevée. La vitesse n'est limitée que par les capacités du GPU, à savoir la quantité de données qu'il est capable de traiter.
Il a également permis de mettre en œuvre assez efficacement des mécanismes de détourage pour les objets invisibles. Les résultats du contrôle de visibilité sont enregistrés directement dans la mémoire vidéo et à partir de là, les commandes de dessin sont formées en fonction de celles-ci. Autrement dit, du côté du processeur, vous n'avez pas besoin d'attendre.
L'un des principaux inconvénients de cette approche est la grande complexité du développement. Beaucoup doit être mis en œuvre à nouveau, en tenant compte de l'approche choisie. De plus, nous avons souvent dû faire face à une situation où le même code de shader fonctionnait différemment ou ne fonctionnait pas du tout sur les cartes vidéo de différents fabricants. Souvent, cela a été "traité" par la mise à jour du pilote, mais parfois après un long débogage, il était nécessaire de réécrire le code.
Naturellement, les exigences pour la carte vidéo ont également augmenté. La prise en charge d'OpenGL 4.5 est une clé, mais pas la seule exigence.
Ci-dessous, nous présentons les résultats de la vitesse de rendu lors de la rotation de l'assemblage. Rappelons que 24 images par seconde (ips) sont considérées comme des indicateurs confortables pour l'œil humain.
Ci-après, des mesures ont été prises sur un PC avec la configuration suivante:
Processeur: Intel Core i7-6700K 4,00 GHz
RAM: 32 Go
GPU: NVidia Quadro P2000
Système d'exploitation: Microsoft Windows 10 x64 Professional
Tableau 1. Fréquence d'images (images par seconde, ips) sur divers modèles. Plus c'est mieux. Mode d'affichage: Demi-teinte + filaire, mode simplifié désactivé, qualité anti-aliasing: moyenne (MSAA 8x)Modèle | La quantité composants | Fréquence d'images, fps |
V16.1 | v17.1 | v18 |
 Voiture broyage de mosaïque
| 2764 | 4.1 | 4.7 | 124,9 |
 PGU-410 | 108337 | 0,3 | 0,4 | 28,6 |
 Tombereau de voiture | 17342 | 1,1 | 1.4 | 124,7 |
 Trolleybus | 9783 | 1,9 | 2,4 | 124,9 |
 Marée nord centrale électrique | 48445 | 0,3 | 0,5 | 76,1 |
 L'installation vide technologique | 7189 | 1,9 | 2,3 | 124,9 |
 Réducteur de navire centrale électrique | 6414 | 2.6 | 3,6 | 123,9 |
Ajout de composants à un grand assemblage
Le scénario avec l'ajout de composants à un grand assemblage est finalement devenu le test dit complexe, décrit dans le tableau 2.
Tableau 2. Scénario avec l'ajout de composants à un grand assemblage. Critères de test.Critère | Description du critère |
Vitesse d'ouverture des fichiers | Le composant ajouté à l'assemblage doit être chargé à partir du disque |
Vitesse de rendu | L'assemblage et le composant inséré doivent être positionnés, pour cela vous devez faire pivoter / déplacer / zoomer l'image |
Vitesse de sélection des objets | Pour créer des contraintes, vous devez sélectionner les objets de base: faces, plans, arêtes, etc. |
Vitesse de synchronisation avec l'arbre de construction | Le composant ajouté à l'assemblage et ses interfaces doivent être représentés dans l'arbre de construction |
Vitesse de synchronisation du module de spécification | Le composant ajouté à l'assemblage doit être pris en compte dans la spécification. |
Dans le tableau, vous pouvez voir les points (dessin, ouverture) qui, dès le début, ont été sélectionnés comme directions d'accélération distinctes. Mais les améliorations nécessitaient d'autres composants.
Un temps important a été pris par synchronisation avec un arbre. Nous avons résolu le problème en implémentant une mise à jour partielle.
Une autre difficulté a été l'impact significatif de la spécification sur les performances de KOMPAS-3D. Dans certains scénarios de test complexes, ce composant était le principal (50% ou plus).
SpécificationLa spécification est le module système KOMPAS-3D, qui est responsable de la formation du document de conception du même nom. Il est développé par une équipe distincte.
En particulier, l'équipe a accéléré la synchronisation lors de l'insertion en repensant les mécanismes internes du module de spécification.
Quelques résultats
Ajoutez des composants à l'assemblage «Réducteur de la centrale électrique du navire».
Test complet pour l'assemblage "Réducteur d'une centrale marine".
Les chiffres indiquent: 1 - support, 2 - rondelle, 3 - boulon.Tableau 3. Temps d'insertion des composants dans un grand assemblage en secondes. Moins c'est mieux.Composant | Action | Heure s |
V16.1 | v17.1 | v18 |
Insérer composant Bracket
 | Chargement | 2.0 | 3.0 | 2.2 |
Passer en mode d'appairage | 0,6 | 0,4 | 0,4 |
Premier appariement | Sélection du premier objet | 0,4 | 1,0 | 0,2 |
Le choix du deuxième objet | 0,5 | 1,1 | 0,2 |
Sélectionnez le bon appariement | 3.8 | 3,6 | 1,0 |
Deuxième appariement | Sélection du premier objet | 0,5 | 1.4 | 0,5 |
Le choix du deuxième objet | 0,5 | 1.4 | 0,2 |
Sélectionnez le bon appariement | 3,6 | 3.0 | 1,2 |
Troisième appariement | Sélection du premier objet | 0,5 | 0,5 | 0,5 |
Le choix du deuxième objet | 0,3 | 1,1 | 0,3 |
Sélectionnez le bon appariement | 3,7 | 3.2 | 1,1 |
Confirmer la création d'insertion | 7.8 | 5.2 | 2,3 |
Insert de support total | 24,2 | 24,6 | 10.1 |
Insérer rondelles de la bibliothèque standard les produits

| Première sélection d'appariement | 6,4 | 2,4 | 0,4 |
Sélection de la deuxième paire | 4.2 | 3,1 | 0,4 |
Confirmer la création d'insertion | 15,7 | 9.2 | 4.4 |
Total pour rondelles d'insertion | 26,3 | 14,7 | 5.2 |
Insérer boulons
 | Chargement | 2.0 | 2.7 | 2.0 |
Passer en mode d'appairage | 0,5 | 0,5 | 0,5 |
Premier appariement | Sélection du premier objet | 0,4 | 1,0 | 0,2 |
Le choix du deuxième objet | 0,4 | 1,1 | 0,2 |
Sélectionnez le bon appariement | 3.4 | 2.7 | 1,0 |
Deuxième appariement | Sélection du premier objet | 0,4 | 1,2 | 0,4 |
Le choix du deuxième objet | 0,5 | 0,5 | 0,4 |
Sélectionnez le bon appariement | 3,7 | 2.9 | 1,0 |
Troisième appariement | Sélection du premier objet | 0,5 | 1,0 | 0,5 |
Le choix du deuxième objet | 0,5 | 1,0 | 0,2 |
Sélectionnez le bon appariement | 4.2 | 3.9 | 1,2 |
Confirmer la création d'insertion | 32,5 | 5,4 | 2.2 |
Total pour l'insertion des boulons | 49 | 21,2 | 9,8 |
L'insertion totale des trois composants | 99,5 | 60,5 | 25,1 |
Un test complet peut être considéré comme l'un des scénarios d'édition de l'assemblage (à partir du nombre de scénarios courants).
De plus, la reconstruction de l'assemblage s'est accélérée. Maintenant, si vous modifiez une opération, l'assemblage entier ne sera pas complètement reconstruit - seuls les objets modifiés seront mis à jour. Pour déterminer les opérations dépendantes, c'est-à-dire les opérations dont le résultat pourrait être affecté par le résultat de l'opération modifiée, un algorithme spécial est utilisé pour établir des relations entre les opérations, les corps et les insertions.
Ouverture des assemblages
L'idée principale pour augmenter la vitesse de lecture des fichiers est de faire en sorte que KOMPAS-3D ne lise que ce dont l'utilisateur a besoin pour le moment.
Par exemple:
- lecture seule de l'exécution en cours pour les insertions d'assemblage,
- pour les types de téléchargement, lisez uniquement les informations nécessaires: triangulation ou triangulation + résultats ( B-rep ).
Tout cela a nécessité un raffinement de la structure des données dans le fichier afin que ses différentes parties puissent être lues.
Anton Sidyakin, programmeur, chef d'équipe:
«Depuis quelque temps, le fichier KOMPAS-3D est une archive combinant plusieurs fichiers de service. L'un d'eux contient des données de modèle / document d'assemblage organisées en arborescence. La possibilité de naviguer dans cette structure existait déjà. Pour une lecture partielle, il fallait assurer l'indépendance des pièces les unes par rapport aux autres. Ainsi, les parties reçues n'auraient pas dû se référer entre elles, sinon la partie avec le lien serait devenue «inférieure».
Par conséquent, pour plus de détails, il a été possible de séparer les performances du document et les unes des autres. Dans les assemblages, le conteneur d'inserts et de contraintes est mis en surbrillance séparément. A l'intérieur des exécutions, il a également été possible de séparer les données initiales de la construction et les résultats sous forme de triangulation et de corps.

Si nous parlons de types de chargement simplifiés, l'assemblage modifiable est entièrement chargé, et seule la triangulation et, selon le type, la représentation des limites (B-rep) sont chargées à partir de ses insertions. L'affichage des insertions avec des variables externes modifiées dans ce mode était d'une certaine difficulté, car elles étaient précédemment obtenues à la volée en reconstruisant lors de la lecture, et dans les types de chargement simplifiés, il n'y a pas de données pour cela. La solution consistait à noter les résultats de la reconstruction de ces inserts dans l'assemblage. Cela a donné une accélération et en raison du manque de reconstruction.
La division décrite du document en pièces ne permettait de charger dans l'assemblage que les performances sélectionnées dans les inserts.
En plus d'accélérer l'ouverture des fichiers, la lecture partielle a également permis de réduire les ressources consommées - principalement la RAM.
Sur la base des améliorations, un nouveau type de chargement d'assemblage est apparu - «Partiel». Dans ce type de chargement, seuls les résultats (corps, surfaces) et la triangulation sont soustraits du fichier. Le chargement partiel vous permet de créer des paires et est proche en termes de fonctionnalité du chargement complet des composants.
Après avoir implémenté des améliorations sur la lecture partielle, la création de types de chargement personnalisés devient prometteuse.
IndiceLes types de démarrage personnalisés sont des combinaisons de méthodes système pour charger un composant. Cette fonction n'est pas nouvelle, mais les améliorations apportées à la v18 vous permettent d'obtenir des bonus importants de son utilisation.
Pour les composants qui ne sont pas importants pour les futures générations, le type de charge «Vide» peut être appliqué. Il peut s'agir de composants cachés à l'intérieur des autres («vnutryanka»). Dans la version 18, les composants (et les assemblages entiers) avec le type de démarrage «Vide» s'ouvrent presque instantanément.
Tableau 4. Temps d'ouverture des assemblages avec les types de démarrage «Vide» et «Dimension» en secondes. Moins c'est mieux.Modèle | Type de téléchargement | Heure d'ouverture, s |
V16.1 | v17.1 | v18 |
 L'installation vide technologique | Vide | 12,8 | 11,7 | 2,5 |
La taille | 21,2 | 20,8 | 2.6 |
 Réducteur de navire centrale électrique | Vide | 31,0 | 15,9 | 7.2 |
La taille | 371,5 | 114,8 | 7.3 |
Les composants restants, qui sont nécessaires pour comprendre l'apparence du produit ou qui seront utilisés comme objets de support pour une construction ultérieure, peuvent être chargés «complètement» ou «partiellement».
En tant qu'outil de préparation de types de démarrage personnalisés, vous pouvez utiliser de nouvelles commandes pour sélectionner des composants «invisibles». Nous appliquons la commande puis utilisons le menu contextuel pour changer le type de chargement des composants sélectionnés en «Vide».
Projection
Lors de l'accélération de la projection, nous nous sommes posé la question du filtrage des données reçues en entrée du noyau mathématique.
Tout d'abord, nous avons décidé de filtrer les composants / corps invisibles. À cette fin, le mécanisme d'occlusion-élimination a été utilisé - il vous permet de savoir si le corps qui sera projeté est visible ou s'il se ferme et se trouve à l'intérieur d'un autre corps. Cette opération est effectuée sur le côté de la carte vidéo.
Le plus grand effet sera lors de la création de projections de modèles avec un grand nombre de composants cachés dans des volumes fermés, par exemple:
- entraînements complexes, boîtes de vitesses, etc.,
- véhicules
- les bâtiments
- armoires avec équipement électrique.
Pour l'inclusion, l'option "Rough projection" est responsable. Le nom n'est pas accidentel - des pièces relativement petites (par exemple, un boulon à l'échelle d'une centrale électrique) peuvent ne pas être projetées à l'échelle d'un assemblage. Pour de nombreux utilisateurs, cette situation conviendra, en particulier dans le cas de la création de dessins dimensionnels et de dessins généraux.
En savoir plus sur l'option Rough Projection.L'option n'est disponible que pour les projections standard. Pour spécifier des images (sections, sections, vues à distance), la "projection grossière" n'est pas impliquée.
Même sans utiliser cette option, la projection est sensiblement plus rapide par rapport à V16 et v17. Cela a été aidé par des améliorations du côté du noyau mathématique.
Tableau 5. Temps nécessaire pour créer trois projections standard en quelques secondes. Moins c'est mieux.Modèle | Il est temps de créer trois projections standard, s |
V16.1 | v17.1 | v18 Inclus brouillon projection | v18 Éteint brouillon projection |
 L'installation vide technologique | 124,1 | 47,5 | 12,9 | 34,6 |
 Réducteur de navire centrale électrique | 256 | 410 | 38,4 | 54,4 |
 Multi-usages unifié corps de boîte | 99,9 | 123,4 | 44,9 | 53,5 |
Toujours en v18, la possibilité de reconstruire des espèces associatives individuelles a été implémentée.
Dans un dessin contenant de nombreuses vues associatives, l'utilisateur a la possibilité de reconstruire des vues individuelles non pertinentes. Par exemple, celui auquel il souhaite ajouter des annotations. Vous pouvez également spécifier les vues créées avec l'option Projection grossière activée.
Reconstruire une vue unique Cette fonctionnalité ne s'applique pas aux accélérations explicites, mais permet à l'utilisateur de gagner du temps.
Résultat du travail effectué pour accélérer la projection du modèle Installation technologique sous vide dans le dessin:
Dans la partie suivante, nous décrirons comment nous avons accéléré le calcul des caractéristiques de centrage de masse (MTC), la contribution du noyau géométrique c3dlabs aux performances COMPAS-3D, les modifications apportées à C3D Modeler et également le matériel adapté à la v18.