Quelle est la définition technique du «traitement par lots de sprites»?

17

Plateforme et langage agnostiquement, comment définit-on le batch sprite? Il semble qu'il existe de nombreuses techniques différentes pour réduire la quantité de travail lors du dessin, et qu'elles sont souvent regroupées avec le "traitement par lots". Il me semble qu'il n'y a peut-être pas de vraie réponse, mais peut-être que quelqu'un ici a trouvé quelque chose que je n'ai pas.

Bloodyaugust
la source

Réponses:

14

Techniquement, le «traitement par lots» consiste à regrouper plusieurs actions et leurs données dans une seule structure de données afin que tout puisse être exécuté en même temps plutôt qu'individuellement.

Le plus gros goulot d'étranglement des GPU modernes n'est pas leur puissance de travail, mais la communication entre votre jeu fonctionnant sur le CPU et le GPU. Chaque paquet de données envoyé au GPU a une surcharge, mais la surcharge d'un petit paquet est tout aussi grande que celle d'un gros paquet, donc c'est un gros gain lorsque vous envoyez un gros paquet plutôt que cent plus petits. Et c'est ce qu'est le traitement par lots; faire un gros paquet de tous ces petits.

Le traitement par lots est particulièrement utile pour les sprites en raison de la quantité ridiculement petite de données par sprite; quatre sommets et quatre coords tex. Ainsi, les frais généraux du petit paquet sont proportionnellement grands.

API-Beast
la source
1
+1 pour avoir mentionné le problème de latence; il s'agit du même principe que celui qui s'applique également au trafic réseau et aux E / S disque - dans le cas général, très peu de gros lots l'emportent sur de nombreux petits lots.
Maximus Minimus
9

Le traitement par lots de sprites est la méthode de soumission de plusieurs sprites au GPU avec un seul appel de tirage.

Aucune des autres réponses n'indique le véritable intérêt de le faire: minimiser les changements d'état et les soumissions de commandes GPU. Si vous avez 100 sprites que je dessine, chacun avec sa propre texture, le matériel ne peut traiter qu'un sprite à la fois. Les dizaines ou même des milliers de cœurs de shader finissent à peine d'être utilisés, et le GPU passe beaucoup trop de temps à configurer son état de rendu pour les commutateurs de texture.

Si vous mettez toutes vos images de sprite dans un atlas, vous pouvez minimiser les changements d'état nécessaires pour dessiner. Le pilote peut même être en mesure de combiner automatiquement les demandes de dessin de sprites en un seul lot afin que le matériel puisse être pleinement utilisé, mais cela n'est ni garanti ni probable.

Si vous utilisez un atlas de sprites, puis créez un seul VBO avec tous vos quads de sprites remplis, et faites une seule demande de dessin avec ces données, vous êtes assuré que le matériel est pleinement utilisé et que tous vos sprites sont rendus en parallèle.

Le traitement par lots des sprites fait alors exactement cela: mettre autant de sprites que possible dans un seul VBO en utilisant un seul atlas qui est soumis au GPU avec un seul appel de tirage, maximisant l'utilisation du GPU.

Il existe d'autres façons de créer des lots de sprites (comme l'instanciation matérielle, l'utilisation de shaders de géométrie, etc.) et d'autres avantages, mais l'essentiel est que le traitement par lots signifie dessiner plusieurs objets par appel de dessin.

Sean Middleditch
la source
-1: Minimiser les changements d'état n'est pas "le point" du batching. C'est juste une exigence découlant de la façon dont OpenGL est structuré. (C'est le point des atlas de texture, mais ceux-ci n'ont pas été demandés.) La question demande spécifiquement une définition "Plateforme et langage agnostique".
API-Beast
Donc, la méthode de tout dessiner dans un backbuffer résout d'abord ce problème, comment? Les données ne sont-elles toujours pas manipulées une par une vers une seule image en mémoire, puis poussées vers le tampon avant? Je pense que ma compréhension doit être un peu défectueuse.
Bloodyaugust
4
M. Beast: cela n'a rien à voir avec OpenGL ou une plate-forme ou un langage. C'est ainsi que le matériel lui-même fonctionne réellement, sur toutes les plateformes et toutes les API graphiques utilisant n'importe quel langage.
Sean Middleditch
6

Ce n'est pas un terme technique bien défini. Le traitement par lots est fondamentalement tout système où vous effectuez plusieurs opérations en tant qu'ensemble plutôt qu'individuellement, et cela est souvent fait parce qu'il est plus efficace de le faire. Les gains d'efficacité proviennent généralement de la possibilité de réutiliser tout ou partie du contexte requis par l'opération.

Ainsi, le traitement par lots de sprites est n'importe quel système qui vous permet de dessiner plusieurs sprites à la fois et, espérons-le, de gagner en efficacité. Habituellement, l'avantage est que votre lot de sprites utilise tous la même texture, vous pouvez donc dessiner tous les sprites du lot sans changer de texture, ce qui est une opération relativement lente.

Kylotan
la source