Quel est l'intérêt d'une Texture SDL2?

je suis un peu coincé sur la logique derrière une texture SDL2. Pour moi, ils sont inutiles puisque vous ne pouvez pas dessiner.

dans mon programme, j'ai plusieurs surfaces (ou quoi étaient surfaces avant de passer à SDL2) que j'ai juste brisées ensemble pour former des couches. Maintenant, il semble que je doive créer plusieurs rendus et textures pour créer le même effet depuis SDL_RenderCopy prend un pointeur de texture.

Non seulement cela, mais les locataires doivent venir à partir d'une fenêtre, que je comprends, mais encore des fautes moi un peu plus.

tout Cela semble extrêmement volumineux et lent. Ai-je raté quelque chose? Est-il possible de dessiner directement à une texture? Quel est le point des textures, et suis-je sûr d'avoir plusieurs (si ce n'est des centaines) de renders à la place de ce qui étaient des surfaces?

25
demandé sur anatoly techtonik 2012-09-20 10:15:52

3 réponses

SDL_Texture les objets sont stockés aussi près que possible de la mémoire de la carte vidéo et peuvent donc facilement être accélérés par votre GPU. Le redimensionnement, le mélange alpha, l'anti-aliasing et presque n'importe quelle opération compute-heavy peuvent être durement affectés par cette augmentation de performance. Si votre programme doit exécuter une logique par pixel sur vos textures, vous êtes encouragé à convertir temporairement vos textures en surfaces. Trouver une solution avec des textures en streaming est aussi possible.

Modifier: Puisque cette réponse reçoit toute l'attention, j'aimerais élaborer ma suggestion.

Si vous préférez utiliser Texture -> Surface -> Texture flux de travail pour appliquer votre opération par pixel, assurez-vous de mettre en cache votre texture finale à moins que vous n'ayez besoin de la recalculer sur chaque cycle de rendu. Les Textures dans cette solution sont créées avec SDL_TEXTUREACCESS_STATIC drapeau.

textures de Streaming (drapeau de création est SDL_TEXTUREACCESS_STREAMING) sont encouragés pour les cas d'utilisation où la source du pixel les données sont un réseau, un périphérique, un frameserver ou une autre source qui est au-delà de la portée complète des applications SDL et quand il est évident que la mise en cache des frames à partir de la source est inefficace ou ne fonctionnerait pas.

il est possible de rendre sur le dessus des textures si elles sont créées avec SDL_TEXTUREACCESS_TARGET drapeau. Cela limite la source de l'opération de tirage à d'autres textures, bien que cela puisse déjà être ce que vous avez demandé en premier lieu. "Textures as render targets" est l'une des plus récentes et des moins répandues prise en charge de la fonctionnalité SDL2.

Nerd info pour les lecteurs curieux:

en raison de la nature de la mise en œuvre SDL, les deux premières méthodes dépendent des opérations de lecture et de copie au niveau de l'application, bien qu'elles soient optimisées pour les scénarios suggérés et suffisamment rapides pour les applications en temps réel.

copier des données à partir du niveau de l'application est presque toujours lent par rapport au post-traitement sur GPU. Si vos exigences sont plus strictes que celles de SDL et votre logique ne dépend pas d'une quelconque source de données pixel externe, il serait raisonnable d'allouer des textures brutes OpenGL peintes à partir de vos surfaces SDL et d'appliquer shaders (GPU logic) pour eux.

les Shaders sont écrits en GLSL, un langage qui se compile en assemblée GPU. Matériel/Accélération GPU renvoie en fait à du code parallélisé sur des noyaux GPU et l'utilisation de shaders est le moyen préféré pour atteindre ce but pour les besoins du rendu.

Attention! L'utilisation de textures et shaders OpenGL bruts en conjonction avec les fonctions et structures de rendu SDL peut provoquer des conflits inattendus ou une perte de flexibilité fournie par la bibliothèque.

TLDR; Il est plus rapide à rendre et à opérer sur les textures que sur les surfaces, bien que leur modification puisse parfois être cumborsome.

34
répondu diegoperini 2015-09-01 09:56:54

en créant une Texture SDL2 comme type de diffusion en continu, on peut verrouiller et déverrouiller la texture entière ou juste une zone de pixels pour effectuer des opérations de pixels directs. Il faut créer préalablement une Surface SDL2, et lier avec lock-unlock comme suit:

SDL_Surface surface = SDL_CreateSurface(..);
SDL_LockTexture(texture, &rect, &surface->pixels, &surface->pitch);
// paint into surface pixels
SDL_UnlockTexture(texture);

la clé est, si vous dessinez à la texture de plus grande taille, et le dessin est incrémental ( par exemple graphique de données en temps réel ) assurez-vous de ne verrouiller et de déverrouiller la zone réelle à mettre à jour. Dans le cas contraire, les opérations seront lentes, la mémoire de la copie.

j'ai connu des performances raisonnables et le modèle d'utilisation n'est pas trop difficile à comprendre.

8
répondu Dan The man 2013-05-22 09:44:29

dans SDL2, il est possible de faire un rendu off-screen / render directement à une texture. La fonction à utiliser est:

int SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture);

cela ne fonctionne que si le renderer active SDL_RENDERER_TARGETTEXTURE.

5
répondu Boris van Schooten 2013-09-22 11:23:58