2017-06-21 4 views
0

Mon application contient une fonction courte qui copie le tampon GPU SFML (sf::RenderTexture converti en sf::Image) en un tableau de couleurs bidimensionnel (qui est stocké dans la RAM et traité par la CPU). Voici le code:SFML - optimiser la copie de GPU à RAM

const sf::Image image = renderTexture.getTexture().copyToImage(); 

for (Point_t y = 0; y < totalHeight; ++y) 
{ 
    for (Point_t x = 0; x < totalWidth; ++x) 
    { 
     const sf::Color& c = image.getPixel(x, totalHeight - y - 1); 
     // here processing this c variable 
    } 
} 

Le problème est: avec un écran 256x64px j'obtiens comme 20 FPS - qui est trop bas, j'ai besoin comme 50 FPS dans ma demande. Comment puis-je améliorer les performances de ce processus?

Peut-être que je devrais utiliser une bibliothèque supplémentaire qui l'accélérerait?

EDIT:

Quelqu'un a suggéré que je devrais utiliser véritable bibliothèque d'imagerie au lieu de SFML. Mais le point est que SFML est une bibliothèque parfaite pour des choses comme la rotation d'objets en temps réel etc., donc je vais coller à SFML, juste besoin d'optimisation ou d'une autre façon de copier le tampon de GPU à CPU.

+1

Avez-vous vérifié ce qui prend la l'heure, l'appel de copie ou votre traitement? – nvoigt

+1

À quelle fréquence vous auriez besoin d'appeler le code ci-dessus? – AlexxanderX

+0

Le processus de copie prend cette fois. J'appelle ce code dans la boucle chaque fois que possible, j'ai besoin de 50-60 FPS donc ce code devrait s'exécuter 50-60 fois par seconde, mais maintenant il est seulement 20. Peut-être qu'il y a une autre façon de le faire? –

Répondre

0

Vous n'avez pas besoin de faire cela, SFML optimise tout cela. Vous avez vraiment besoin d'une image que vous ne pouvez pas passer à travers sf :: Texture et sf :: Sprite?

+0

J'ai besoin de la couleur de chaque pixel, et la texture ne fournit pas cette possibilité –

+0

Il est alors la seule solution et il est lent parce qu'il génère une nouvelle image de chaque appel à 'copyToImage()'. SFML ne gère pas ça je pense ... Peut-être que tu devrais essayer une autre lib, ou utiliser directement Xlib (seulement sur unix). –