2016-07-10 2 views
0

Je suis actuellement en train de migrer un tas d'applications du rendu SDL2 (en interne en utilisant OpenGL) au rendu OpenGL "pur". Au cours de ce travail, j'ai compris comment télécharger des textures sur le GPU et appris que chaque texture a un index. Pour faire du texte, j'utilise les fonctions SDL_TTF qui vous permettent, au fond, de télécharger une texture sur le GPU représentant du texte. La plupart des applications que je migre ne sont pas lourdes mais j'ai remarqué un problème possible avec elles. Imaginez une application qui accepte la saisie de texte utilisateur et qui s'affiche à l'écran: chaque frappe génère une nouvelle texture avec tout le texte entré (toute autre texture précédente liée à la même fonctionnalité sera supprimée). Donc, pour écrire "Bonjour" nous aurions cinq textures: "H", "He", "Hel", "Hell" et enfin "Hello". Comme dit, chaque texture "précédente" (dans ce cas de "H" à "Enfer") serait supprimée et seule la mémoire de "Hello" resterait. Pourtant, dans les applications lourdes de texte (par exemple, en utilisant cette méthode pour mettre le score d'un jeu, en faisant assez mal pour générer une nouvelle texture pour chaque image) beaucoup de textures seraient téléchargées et supprimées et la texture index continuerait à croître.OpenGL + SDL_TTF: recyclage d'index de texture

Ma question principale est la suivante: est-ce que OpenGL va recycler ces index ou va-t-il manquer de chiffres et tomber en panne? PS: Je suis conscient de la possibilité d'emballer tous les caractères TTF dans un atlas et juste obtenir les lettres dont j'ai besoin. Je n'aimerais pas voir cela maintenant, à moins que mon approche actuelle ne soit dangereuse (cette sorte d'atlas ressemble à d'anciennes polices bitmap). PS2: Je suis également conscient que changer de textures n'est pas toujours performant (GPU), mais ces applications ne sont pas difficiles graphiquement et ont de bonnes performances dans les systèmes plus anciens.

+0

Si cela vous concerne, pourquoi ne pas simplement remplacer les données de texture sans recréer l'identifiant/nom de la texture? C'est à dire. 'glTexImage' à nouveau, ou allouer une grande texture et remplacer des parties de ses données plus tard. – keltar

+0

Oui, oui, c'est exactement ce que je prévois de faire à l'avenir :). Voir, tous les textes qui peuvent changer (par exemple, le marqueur de score ci-dessus dans un jeu ou des boîtes de conseil) sont encapsulés dans des classes qui gèrent la suppression de leurs ressources (elles ont généralement une longue durée de vie, pas beaucoup d'index consommés).Je pourrais très bien les étendre pour "remplacer" la texture actuelle, mais je ne savais pas au sujet d'un code hérité que je traîne. Merci beaucoup. –

Répondre

2

Les objets OpenGL sont référencés par ce que la spécification OpenGL appelle "noms" (d'autres termes souvent utilisés en programmation sont "handle" ou "id"/"identifier"). Lorsqu'un nouveau nom est lié pour la première fois (avec glBind…), un objet OpenGL correspondant (texture, tampon, etc.) est créé; certaines fonctions OpenGL créent des objets et lui retournent le nom (glCreate…). Après la suppression d'un nom (valide) (avec glDelete…), l'objet OpenGL correspondant est désalloué une fois que la dernière référence interne est libérée. Les noms peuvent être validement réutilisés (par OpenGL) après leur suppression, en faisant référence à un objet différent.


Ne pas réinventer la roue. Le rendu de texte avec OpenGL est ridiculement compliqué et il n'existe pas (encore¹) la seule méthode parfaite. Il existe cependant plusieurs bibliothèques qui traitent des problèmes de génération de texture et de gestion des ressources. Fais-toi plaisir et utilise-en un. Dans votre freetype-gl de cas serait la meilleure option (à mon humble avis): https://github.com/rougier/freetype-gl


1: Je travaille actuellement sur une nouvelle rastérisation glyphe à base de shaders qui répond à la plupart des problèmes connus, mais il est pas encore fait .

+0

Datenwolf, merci pour le post mais il ne répond pas vraiment à la question qui a été posté sur le recyclage des indices. À l'heure actuelle, je ne suis pas intéressé à utiliser les nouvelles bibliothèques autant que moi pour en savoir un peu plus sur le fonctionnement. Encore, merci, je garderai Rougier à l'esprit quand tout se dirigera vers le sud :). –

+0

@TheMarlboroMan: Si vous avez correctement 'glDeleteTextures' et déliez les noms de texture inutilisés (cela arrivera éventuellement), les noms de texture vont être recyclés. Les noms de texture ne doivent pas être incrémentaux ou sans intervalles. – datenwolf

+0

Je fais glDeleteTextures dans le destructeur de la classe de texture elle-même afin que la partie soit claire. Pour être honnête, je ne sais même pas qu'il y a une fonctionnalité "nom de texture" dans OpenGL donc je suppose que je suis en sécurité. Pourriez-vous mettre à jour votre réponse avec les informations de recyclage afin que je puisse résoudre cette question? –