SFML: Bild (pixel-array) schnellstmöglich anzeigen



  • Hallo,

    ich suche eine Möglichkeit in SFML mein char-array schnellstmöglich darzustellen.
    Momentan habe ich zwei Möglichkeiten, mein Bild überhaupt darszustellen:

    char* pImage;
    
    // set pImage..
    
    sf::Image img( width, height, reinterpret_cast<sf::Uint8*> (pImage));
    

    bzw:

    sf::Image img;
    int nSize = width * height * bitsProPixel / 8;
    
    sf::Uint8* pCopy = new sf::Uint8[nSize];
    memset( pCopy, 0, nSize);
    memcpy( pCopy, pImage, nSize);
    
    img.LoadFromPixels( width, height, pCopy);
    

    und:

    sf::Image img( width, height, sf::Color(0,0,0,255));
    sf::Color col;
    
    int pix = 0;
    for (int y = 0; y < height; y++)
    {
    	for (int x = 0; x < width; x++)
    	{
    		col.b = pImage[pix];
    		pix++;
    		col.g = pImage[pix];
    		pix++;
    		col.r = pImage[pix];
    		pix++;
    		col.a = 255;
    		pix++;
    
    		img.SetPixel(x, y, col);
         }
    }
    

    Da mein Bild aber 1280x1024 groß ist brauche ich pro Durchlauf jeweils geschätzte 2-3 Sekunden.
    Und das ist natürlich viel zu langsam.

    Davon abgesehen wird mein Bild viel zu schmal gerendert, wenn ich ein Farbformat mit 8Bit benutze.
    Ein Farbformat mit 32Bit funktioniert nur in der 3en Methode.

    Bin für jeden Tip dankbar.

    Grüße,
    ActiveO2

    PS:
    Zuvor habe ich versucht das Problem mit SDL zu lösen, falls hierzu jemand etwas weiß:
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1913901.html#1913901



  • Du solltest es vermeiden, alle Pixel zu kopieren. Erst recht, wenn du eine manuelle Schleife verwendest...

    Mit SFML 2 (als SVN verfügbar) kannst du sf::Image::UpdatePixels() verwenden, um das Bild direkt in den Videospeicher zu laden. Allerdings musst du zuerst eine genügend grosse Textur erstellen (am Anfang ein leeres sf::Image mit der gewünschten Grösse zu erstellen sollte reichen).

    Mit SFML 1 kannst du höchstens den GetPixelsPtr() mit const_cast und reinterpret_cast in einen char* umbiegen und dann direkt dort reinschreiben. Allerdings ist das nicht sehr elegant.



  • Danke für die Antwort.
    Ich wag mich mal an SFML2 👍



  • Meine Erfahrung ist, das man in SFML gar nichts schnell macht.

    Warum musst du unbedingt ein char Array rendern? Muss dies wirklich eine so hohe Aufloesung haben? Und ich wuerde einfach mal D3D und memcpy in eine Textur versuchen (dazu muss das Array natuerlich passendes Format haben), viel schneller duerfte es hardwarebedingt nicht funktionieren f'`8k

    Gruß, TGGC (der kostenlose DMC Download)


Log in to reply