Temps d’exécution: GetFrontBufferData, GetBackBuffer, GetRenderTargetData

J’essaie plusieurs méthodes pour capturer l’écran avec DirectX et j’ai mis au point 3 méthodes jusqu’à présent:

  • GetFrontBufferData() – Temps d’exécution moyen:
    • GetFrontBufferData() : 0.83598 s
    • D3DXSaveSurfaceToFile() : 0.0036 s
    • Total: 0.83958 s
  • GetBackBuffer() – Temps d’exécution moyen:
    • GetBackBuffer() : 0 s <- INTÉRESSANT – POURQUOI?
    • D3DXSaveSurfaceToFile() : 0.2918 s
    • Total: 0.2918 s
  • GetRenderTargetData() – Temps d’exécution moyen:
    • GetRenderTargetData() : 0.00928 s
    • D3DXSaveSurfaceToFile() : 0.00354 s
    • Total: 0.01282 s

Les temps moyens ont été calculés en prenant 50 screenshots et en mesurant le temps avec clock() .

Toutes les méthodes ci-dessus fonctionnent, cependant, comme vous pouvez le voir, les temps d’exécution varient beaucoup d’une méthode à l’autre pour les mêmes résultats (apparemment).

J’ai donc quelques questions:

  • Pourquoi le temps d’exécution diffère-t-il tellement d’une méthode à l’autre?
  • Pourquoi GetBackBuffer() très rapide mais que D3DXSaveSurfaceToFile() est très lent?

J’ai une hypothèse sur ma première question, corrigez-moi si je me trompe:

  • GetFrontBufferData() est très lent car le tampon avant se trouve dans la VRAM et est verrouillé / protégé car c’est ce qui est actuellement affiché à l’écran.
  • GetBackBuffer() (et D3DXSaveSurfaceToFile() ) est plus rapide car le tampon arrière se trouve dans la VRAM, mais il n’est pas actuellement affiché à l’écran, ce qui facilite sa récupération.
  • Enfin, GetRenderTargetData() est rapide car la cible de rendu se trouve dans le RAM système (pas dans la VRAM), nous pouvons donc la récupérer très rapidement.

Je vous remercie.

EDIT: Je cherche toujours une réponse.

Le processus auquel vous faites référence est appelé “relecture”, qui consiste à copier les données à partir de la RAM vidéo du GPU. À l’exception de quelques architectures de mémoire unifiée spécifiques (telles que Xbox 360), la relecture est un processus lent.

Selon votre système d’exploitation et d’autres parameters, il est probable que la mémoire tampon avant et la mémoire tampon arrière ne soient que des textures «hors écran» dans la VRAM. Lorsque vous arrêtez le rendu pour capturer une capture d’écran, il existe également divers blocages et blocages de pipeline GPU.

Vous pouvez trouver cet article (maintenant plutôt vieux) utile.

Notez que Direct3D 10/11 offre de nombreuses fonctionnalités pour surmonter la lenteur inhérente de la lecture du GPU, principalement en permettant aux algorithmes de conserver les données sur le GPU.