Dfpsr
Une bibliothèque de rendu logiciel moderne pour C ++ 14 en utilisant SSE / NEON créé par David Forsgren Piuva. Si vous cherchez la dernière mode traditionnelle, regardez ailleurs. Il s'agit d'une bibliothèque de logiciels de qualité destinée à être développée sur plusieurs décennies et à survivre à vos petits-enfants avec un minimum de maintenance. Tout comme la sculpture de votre héritage en pierre, il faut plus d'efforts pour maîtriser la compétence, mais donne un résultat plus robuste en ne s'appuyant pas sur une bibliothèque lointaine. Expérience utilisateur maximale et dépendance minimale du système.
Arrière-plan du créateur
Dxomark World Record dans la stabilisation vidéo numérique de l'industrie mobile. A travaillé avec la vision robotique critique de la sécurité pour le contrôle de la circulation de l'aéroport civil. A tenu des conférences en optimisation dans différentes entreprises des industries mobiles, médicales et de jeux. A travaillé avec des optimisations sur GPU, CPU, DSP, ISP, FPGA et ASIC.
L'optimisation a besoin de bons outils pour gagner du temps
La partie la plus importante de l'optimisation du code consiste à saisir à la fois des algorithmes élevés et des limitations matérielles faibles, car vous ne pouvez pas laisser un scientifique concevoir l'algorithme et un programmeur l'optimisera sans place pour les modifications dans l'assembleur manuscrit (l'erreur la plus courante). La conception de l'algorithme n'est pas effectuée tant que vous avez un bon compromis entre la qualité et les performances avec toutes les optimisations en place. Les économies de temps au prix de la qualité en un seul endroit peuvent être compensées en augmentant la qualité à un coût plus faible ailleurs pour augmenter la vitesse et la qualité. Plus rapidement, vous pouvez créer une vectorisation presque optimale d'un algorithme, plus vous pouvez itérer rapidement le processus de conception. Pensez à ce que vous approximation. Votre objectif est-il de dessiner autant de polygones parfaitement droits que possible, ou est-ce que l'objectif approximative est une forme complexe du monde réel en utilisant une technique?
Le site officiel: dawoodoz.com
À quoi pourraient ressembler vos jeux en utilisant le rendu isométrique du processeur

Lumière dynamique en temps réel avec des ombres coulées basées sur la profondeur et une cartographie normale à 453 images par seconde en 800x600 pixels fonctionnant sur le CPU. Des résolutions plus élevées briseraient le style rétro et auraient l'air pire, mais il reste beaucoup de temps pour la logique de jeu et les effets supplémentaires. En avant le rendu des modèles 3D aux images diffuses, normales et en hauteur, la lecture des données est beaucoup plus efficace de cache sur les processeurs modernes que d'utiliser une perspective libre. Cela permet également d'avoir plus de triangles que de pixels à l'écran et de faire des mises à jour passives de la géométrie statique. Des modèles 3D faibles sont utilisés pour lancer des ombres dynamiques.
Le rendu 3D traditionnel avec des polygones est également pris en charge

Le rendu 3D n'est pas aussi rapide que le rendu 2D ou isométrique sur le CPU, mais atteint souvent 60 Hz en 1920x1080 pixels pour des graphiques faibles. Pour un niveau de détail plus élevé et plus de fonctionnalités, il est recommandé de copier et de modifier le pipeline de rendu pour le faire codé en dur pour uniquement les fonctionnalités que vous souhaitez, puis de simplifier les mathématiques pour votre moteur de rendu spécifique, comme fait pour l'exemple de bac à sable où seules les couleurs de sommet sont nécessaires pour l'interpolation de l'absence sans permission, les couleurs peuvent être calculées en augmentant les valeurs de couleur au lieu d'interpoler à partir de l'abat de perspective, les couleurs peuvent être calculées.
Pourquoi utiliser un rendu de logiciel open source lorsque les GPU sont si rapides?
- La robustesse à l'aide d'un rendu de logiciel ne ruinera probablement pas votre système lors de l'erreur, contrairement aux API graphiques pour le GPU qui sont sujets aux écrans bleus.
- Déterminisme Si cela fonctionnait sur un seul ordinateur, il fonctionnera probablement de la même manière sur un autre ordinateur avec des différences mineures entre les systèmes d'exploitation. OpenGL, cependant, n'a aucune fonctionnalité restante si vous supprimez tout ce qui a un bogue dans une implémentation de pilote.
- Bas-frais basse lorsque vous voulez une faible résolution pour le style visuel ou la vision robotique, vous pourriez aussi bien le garder minimal avec un rendu logiciel lié statiquement lorsque le GPU serait plus lent.
- Débogage facile lorsque toutes les données sont traitées dans un rendu de logiciel, il est beaucoup plus facile de voir ce qui s'est passé pendant le débogage.
- Facile à modifier, il n'y a pas de limites matérielles autres que les cycles et la mémoire CPU, vous pouvez donc modifier l'intégralité du pipeline de rendu en copie et en collant du code.
- Pixel Exact 2D au lieu de faire des solutions d'étranges de contournement sur des polygones, un rendu de logiciel vous a permis de travailler avec des pixels entiers pour commencer.
Pourquoi utiliser ce rendu de logiciel?
- Dépendances minimales du système Tout ce qui concerne une API système spécifique est placé dans un module de wrapper séparé intégrant le strict minimum de fonctionnalités essentielles qui devraient être faciles à intégrer sur les futurs systèmes d'exploitation. Contrairement aux autres rendus de logiciels, celui-ci ne nécessite aucun pilote graphique, car vous pouvez obtenir les mêmes performances en utilisant le multi-threading en téléchargeant la toile sur un fil d'arrière-plan lorsque la plupart des cœurs sont de toute façon inactifs.
- Pas de binaires La bibliothèque entière est automatiquement compilée à partir du code source. Même le système de construction se compile avant de construire votre projet. Cela garantit que personne à l'avenir n'a à rétro-ingénieur des binaires des siècles lorsque vous essayez de construire votre programme, et cela le rend également beaucoup plus sûr contre les logiciels malveillants lorsque tout peut être inspecté dans un code lisible.
- Lien statique liant toute la bibliothèque est lié statiquement à votre programme, comme si vous aviez écrit le code vous-même. Seules les API du système de base qui ont survécu pendant des décennies sont invoquées en tant que dépendances, pas de chauffeurs GPU, pas de couches de support externes. Tout, de la façon de coder les caractères Unicode et de rendu les polices à la façon dont un polygone est rastérisé contre un tampon de profondeur existera dans votre programme C ++ compilé pour une fiabilité et un déterminisme maximaux. Le système de construction permet de lier statiquement les bibliothèques standard C ++ lorsque cela est possible.
- Créez votre héritage Faire un logiciel que les générations futures pourraient être en mesure de porter, de compiler et d'exécuter nativement sans avoir besoin d'émulateurs ou d'ingénierie inverse des pilotes graphiques propriétaires.
Fonctionnalités de cette bibliothèque
- Système de build C ++ entièrement automatique, plus de longues listes de fichiers source dans votre projet. Le système de construction inclus trouvera automatiquement les en-têtes inclus et leurs fichiers source correspondants. Dites-lui simplement de ramper de la main et de le laisser comprendre automatiquement le reste. Différents backends pour les bibliothèques sont gérés en incluant l'en-tête du projet de la bibliothèque, indiquant quel backend utiliser pour chaque plate-forme. Les sommes de contrôle sont utilisées pour créer uniquement ce qui a changé, il n'est donc pas nécessaire de créer une bibliothèque statique pour des parties de votre code.
- Dessin 2D Pixel Exact Standard Draw appelle des lignes, des rectangles, une copie d'image solide, un dessin d'image filtré alpha, un dessin tamponné en profondeur et un dessin au pochoir.
- 3D Rendu à peu près équivalent à Direct3D 7 avec un échantillonnage de texture bilinéaire, un mipmapping, desmaps et un filtrage alpha lorsqu'ils sont utilisés hors de la boîte, mais peuvent être modifiés pour ressembler davantage à la 3D 9 directe si vous appliquez l'ombrage aux textures (peut utiliser SIMD avec un fil à jeu multiple et planifié en fonction de la distance de visualisation).
- Système d'occlusion La collecte des tâches de rendu pour le multi-threading contient également une grille d'occlusion où les formes d'occlusion peuvent être dessinées pour sauter le dessin de triangles, d'objets ou de groupes entiers si votre moteur implémente une phase générale pour les tests d'abattage et d'occlusion. Cette occlusion entièrement dynamique peut ensuite être combinée avec des optimisations statiques pour des jeux spécifiques en utilisant des informations sur les régions que les régions peuvent être vues à partir de chaque emplacement de la caméra.
- Coupage lointain facultatif car cette API graphique utilise uniquement des tampons de profondeur à virgule flottante pour la perspective, il n'est pas nécessaire de normaliser les valeurs de profondeur pour toute représentation basée sur un entier. Cela permet de sélectionner une distance infinie de clip Far lors de la création de votre appareil photo, si vous pouvez vous permettre de rendre toute la scène à la fois.
- Couche multimédia Couche multimédia multiplateforme conçue pour la robustesse. ALSA et WINMM Sound Backends pour un contrôle total sur le mélange de son, sans avoir à appeler quelque chose de spécifique vous-même. La gestion des fenêtres utilise le multi-threading pour télécharger le canevas, afin que vous n'ayez pas besoin de pilotes graphiques GPU et de fortes dépendances juste pour télécharger le résultat. Utilise une fenêtre sans bordure pour l'écran complet, afin que vous puissiez facilement accéder à d'autres programmes si vous obtenez un e-mail important ou un message instantané en arrière-plan. L'amélioration est effectuée sur le CPU pour travailler avec une résolution d'écran sans s'appuyer sur des pilotes graphiques qui pourraient donner aux pixels la mauvaise interpolation ou ne pas exister. Des couches multimédias plus anciennes conçues pour les écrans CTR peuvent entraîner des erreurs de fréquence hors de portée lorsqu'aucun pilote graphique n'est installé et que l'affichage n'accepte pas la sélection arbitraire de la résolution. Utilise une icône de curseur invisible pour cacher la souris, afin qu'un programme de crash ne retire pas le curseur lorsque vous essayez de tuer le processus.
- Interface utilisateur graphique Framework Chargez une interface visuelle à votre fenêtre à l'aide d'une seule ligne de code en lisant un fichier de disposition ou une chaîne. Obtenez des poignées génériques aux composants à l'aide de noms ou une combinaison de nom et d'index. Ajoutez des événements en attachant des fonctions lambda aux rappels de composants et de fenêtres.
- Les minuteries obtiennent les secondes de double précision depuis le premier appel à la minuterie, afin que vous n'ayez pas à vous soucier des bugs de minuit lorsque l'heure de la journée se réinitialise.
- La couche d'abstraction SIMD utilise Simd.h pour générer automatiquement des intrinsèques SSE, AVX et néon très efficaces à partir de syntaxe mathématique entièrement lisible. Votre code vectorisé ressemblera à une implémentation de référence et à la compilation pour une architecture cible inconnue générera des opérations scalaires qui peuvent toujours donner un coup de pouce en rédaction de votre algorithme avec des opérations de base qui sont le plus souvent pris en charge directement dans les tâches du processeur, et facilitant la mémoire pour un compilateur auto-vectorisé si quelque chose de similaire avec un nom différent existant.
- Les pointeurs sûrs utilisent SafePointer.h pour attraper plus d'erreurs en disant à votre pointeur sur quelle partie d'une allocation sur laquelle il peut fonctionner. Ne laisse aucune surcharge dans la version de version, afin que vous puissiez toujours remplacer votre pointeur brut par SafePointer et savoir que vous obtiendrez un message d'erreur informatif par le nom du pointeur et des informations détaillées lorsque quelque chose de mauvais se produit.
- Les chaînes utilisent UTF-32 pour stocker les caractères en mémoire pour s'assurer que tous les algorithmes fonctionnent avec des caractères non latins (compatibles avec u "" littéraux de chaîne). Enregistrer dans les fichiers par défaut vers UTF-8 (stockage compact) avec BOM (disant explicitement quel format est utilisé) et des terminaisons de ligne CR LF (de sorte que les fichiers texte encodés n'importe où peuvent être lus partout). Utilise automatiquement des tampons de mémoire partagés pour permettre la division d'une liste de chaînes sans inonder le tas de petites allocations.
- Tampons Tous les fichiers sont enregistrés et chargés via des objets tampons. Cela garantit que tous les formats de fichiers que vous concevez n'ont qu'à vous soucier de la façon de coder les octets, les tests de régression seront faciles en n'impliquant pas les effets secondaires externes du système de fichiers, et tout fichier peut être regroupé dans le vôtre en utilisant l'équivalent tampon d'une fonction de sauvegarde.
- La gestion des fichiers est à peu près équivalente à STD :: Système de fichiers à partir de C ++ 17, mais fonctionne avec C ++ 14, utilise la même chaîne et les mêmes types les plus liés sur toutes les plates-formes et peut automatiquement corriger les séparateurs de dossiers entre / (POSIX) et (MS-Windows).
- La gestion des processus peut démarrer d'autres applications et suivre leur statut, afin que vous puissiez appeler une application comme une fonction écrivant le résultat dans les fichiers.
Résumé des licences
Cette bibliothèque utilise principalement la licence Open Source ZLIB, mais comprend également la bibliothèque d'images STB pour enregistrer et charger des images, qui a une double licence permissive (MIT / UNLICENSE). Étant donné que la bibliothèque d'images STB peut être utilisée comme domaine public, il n'a aucun effet juridique sur l'utilisation de la bibliothèque dans son ensemble sous la licence open source ZLIB. Tous les code source inclus avec toutes leurs licences permettent une utilisation commerciale et non commerciale, y compris la modification non divulguée du code source. Si vous ne redistribuez pas le code source, vous n'avez à dire à personne que vous utilisez cette bibliothèque, car une approbation non sincère n'a aucune valeur.
Toujours une version bêta publique
Le thème, l'interface graphique, la police et les API Sound sont toujours en cours de développement actif et peuvent avoir des changements importants avant qu'une version 1.0 stable ne soit prête, car un code est juste un espace réservé primitif jusqu'à ce que l'implémentation avancée puisse la remplacer, et il faut essayer d'utiliser réellement la bibliothèque avant que les problèmes d'utilisabilité ne deviennent évidents. Les API de tampon, de fichier, d'image, de dessin, de filtre, de chaîne et de temps sont cependant déjà assez stables. Vous pouvez choisir de vous en tenir à une version spécifique pour chaque nouveau projet, de rester à jour avec les dernières modifications ou d'attendre la version 1.0 stable.
Comment vous pouvez aider
- Port vers Macintosh ou Wayland en utilisant les mêmes principes de dépendance minimale.
- Testez cette version bêta et donnez des commentaires sur la conception avant la sortie de la version 1.0.
- Créez différents types de moteurs de jeu avec des outils open-source.
Matériel CPU pris en charge:
- Intel / AMD utilisant des intrinsèques SSE2 et des extensions facultatives.
- ARM à l'aide d'intrinsèques néon .
- Architectures CPU inconnues, sans vectorisation SIMD comme solution de secours.
Plateformes:
- Linux , testé sur Mint, Mate, Manjaro, Ubuntu, Raspberrypi OS, Raspbian (Buster ou plus tard). Linux Mint a besoin des en-têtes de compilateur et x11, alors exécutez "Sudo apt install g ++" et "sudo apt install libx11-dev" avant la compilation. Soutenir actuellement X11 et Wayland est prévu pour les futures versions.
- Microsoft Windows , mais plus lent que sur Linux car Windows a de nombreux processus d'arrière-plan et la gestion du thread et de la mémoire plus lente.
Pourrait également fonctionner sur:
- BSD et Solaris ont du code ciblant les plates-formes dans fileaPi.cpp pour obtenir le dossier d'application, mais il manque probablement certaines applications pour exécuter le script de construction. Les futurs systèmes conformes à POSIX ne devraient avoir que quelques bizarreries à trier s'il dispose d'un serveur X11.
- Big-Endian est soutenu en théorie si l'activation du macro DSR_BIG_ENDIAN à l'échelle mondiale, mais cela n'a jamais été testé en raison de difficultés à cibler un tel système avec des compilateurs modernes.
Pas encore porté vers:
- Macintosh n'utilise plus X11, il faudra donc un effort de portage. Macintosh n'a pas de lien symbolique au binaire du processus en cours, il se replierait donc sur le répertoire actuel lors de la demande du dossier d'application.
Ne ciblera pas:
- Téléphones mobiles. Parce que les changements constants qui se décomposent la compatibilité sur les plates-formes mobiles vaincre le but d'utiliser un cadre à longue durée de vie. Les plates-formes mobiles nécessitent des compilateurs C ++ personnalisés, l'accès aux processeurs de signal, la rotation d'écran, la sauvegarde de la batterie, la connaissance du clavier virtuel, les autorisations de sécurité, les écrans en plein écran forcés ... Essayer de faire les deux en même temps finirait par des compromis de conception dans les deux extrémités comme Microsoft Windows 8 ou Ubuntu's Unity Lock Screen, il serait donc préférable de prendre des morceaux dans un nouveau bibliothèque de nouveaux bibliothèques sur un nouveau bibliothèque construit sur des principes de conception différents.
- Frontends Web. Un tel emballage sur cette bibliothèque ne pourrait pas obtenir la puissance de SIMD Intrinsics pour définir vos propres filtres d'image, vous feriez donc mieux de cibler un langage d'ombrage GPU du navigateur qui est plus adapté aux scripts dynamiques.