2016-12-12 2 views
2

Supposons que le pipeline est entièrement plein: GPU en attente sur vsync, les tampons de commande GPU/pilote sont tous pleins, et donc le programme utilisateur bloqué.Combien de cadres est un pipeline graphique moderne?

Combien de trames valent des données dans le pipeline (moderne)?

Par exemple: (4)

  1. trame dans un tampon d'avant GPU
  2. Structure en GPU back buffer
  3. trame dans le tampon de commandes de GPU
  4. trame dans le tampon de commande de pilote de CPU

Répondre

4

Pour les API traditionnelles (API de type Buffer non-Command), la seule chose qui compte vraiment est le nombre de tampons que vous utilisez. Le pipeline graphique peut être pipeline, mais le pipeline n'est pas si profond que plusieurs trames entièrement séparées peuvent être en cours de traitement en même temps. Ainsi, la ou les files d'attente du GPU et le GPU lui-même ne traiteront généralement qu'une seule trame. Et comme il n'y a aucun moyen réel dans ces API de construire des données de commande pour plusieurs images entières, le nombre de trames que vous pouvez avoir en vol sera limité par le nombre de tampons réels que vous utilisez. Le nombre de trames de latence serait généralement le nombre de tampons + 1, représentant le cadre que vous construisez.Pour les API de mémoire tampon de commande, le nombre d'images est généralement basé sur la quantité de mémoire CPU dont vous disposez. Le nombre de tampons fournit un minimum, mais rien ne vous empêche techniquement de mettre en mémoire tampon des dizaines ou des centaines d'images à l'avance. En dehors de la mémoire du processeur.

Bien sûr, cela suppose que toutes vos données par image se trouvent dans des disjoncteurs. Si l'une de ces données est dans la mémoire accessible par le GPU (par exemple, des matrices de matrices et ainsi de suite), ou si vous avez besoin de changer les ensembles de descripteurs entre les trames, vous avez maintenant un autre ensemble de choses à tamponner. Cela impose une limitation supplémentaire sur la profondeur des choses.

+1

Merci pour la réponse. Comment savoir combien de tampons j'utilise? (C'est le niveau de connaissance graphique que j'ai: P) Par exemple, dans mes projets, je ne fais qu'un seul framebuffer. – Kay

+0

@ user7226419: En OpenGL, vous ne pouvez pas contrôler directement le nombre de tampons dans le framebuffer par défaut. Donc, cela n'a pas vraiment d'importance si vous pouviez compter ou non; vous ne pouvez rien faire avec cette information. Pour les API de commande-tampon, vous demandez un nombre spécifique de tampons. –

+1

Bien qu'il ne soit pas capable de contrôler le nombre de tampons, y at-il généralement des tampons X? Ex: pour les implémentations OpenGLES 2.0 sur iOS, Android. – Kay

4

Cela dépend de la carte graphique que vous utilisez et du mode dans lequel vous l'avez placé, mais de manière générale, la réponse est 1-3 images (ou 2-4) , si vous comptez le cadre qui est poussé dans le tampon en tant que cadre).

  • Sans Vsync ou tout autre type de stratégie à double mise en mémoire tampon, il n'y a rien exigeant que plus de 1 cadre être conservé en mémoire à un moment donné, d'être écrasé dès qu'un nouveau cadre est poussé dans le tampon . Lorsque VSync est activé, les nouvelles trames sont poussées dans une seconde section du frame buffer, et retardent l'exécution de toutes les futures commandes jusqu'à ce que le "Vertical Sync" (d'où le nom, évidemment) se déclenche, à quel point les deux trames sont renversé.
  • Un troisième mode, rare OpenGL mais familière aux utilisateurs Vulkan et DirectX, appelé "mode Letterbox", ou parfois appelé "Triple Buffering", conserve deux "buffers Retour" pour un total de trois tampons:
    • L'un des tampons arrière est réservé à l'utilisation lorsque les déclenchements de synchronisation verticale.
    • L'autre tampon arrière reçoit les trames terminées directement, sans retards
    • Chaque fois qu'une synchronisation verticale se produit, les rôles de ces deux tampons arrière sont commutés.

Notez que Triple Buffering, l'hôte ne soit pas bloqué lorsque la mémoire tampon est pleine. Le GPU peut choisir de mettre en tampon des trames supplémentaires, comme dans votre exemple, bien que cela soit plus commun à OpenGL/DirectX11- qu'à Vulkan/DirectX12 +, puisque dans ces dernières API, l'hôte est beaucoup plus explicite termes de ce que le GPU est censé faire, et je ne peux pas imaginer un programmeur qui étend volontairement le tampon de trame. On ne sait pas vraiment quel avantage cela offrirait au-delà de ce que Triple Buffering offre déjà.

+0

OK. Donc, empiriquement, en utilisant OpenGL avec vsync sur - j'ai remarqué que: (1) Tant que je suis en mesure d'obtenir 2 images CPU soumises en 32.2ms (peu importe si le premier a pris 27ms, et le second a pris 3ms) - alors je n'observe aucune chute d'images. (2) Cependant, ne pas le faire entraîne une chute de trame. Que puis-je conclure sur le pipeline de la plate-forme? – Kay

+0

@ user7226419 C'est le comportement naturel de VSync. Si la deuxième trame arrive même après la coupure pour la synchronisation verticale, le GPU attendra la prochaine avant de présenter la trame. – Xirema

+0

Le GPU n'a pas attendu du tout si la première image a raté le cutoff. Je suppose que c'est parce qu'il y avait un frame 0, déjà dans le pipeline, en avance sur le premier, que le GPU était capable d'afficher? C'est à dire. au moins 1 cadre «latent» dans la canalisation? – Kay