SDL zu langsam (und weiß nicht warum)



  • Ich wollte einen 2D-Geschwindigkeitstest machen. Ich wollte ein PNG-Bild laden (192x288x32bit mit alpha). Dieses Bild wird 100.000x auf den Bildschirm gezeichnet. Es muß auf jeden Fall mit Alpha korrekt gezeichnet werden.

    Zuerst habe ich Irrlich(OpenGL) probiert... 3,4 sec.
    Dann habe ich BlitzBasic(DirectX) genommen... 2,5 sec
    Mit SDL+SDL_image ist es aber sehr langsam... 19,7 sec

    Was mache ich falsch?
    Bei SDL habe ich immer fertige builds genommen. Kein Debug

    #include "SDL.h"
    #include "SDL_image.h"
    
    SDL_Surface* loadimage(char* path)
    {
    	//declare
    	SDL_Surface* temp;
    	SDL_Surface* image;
    
    	//load
    	temp = IMG_Load(path);
    	if (temp==0) return 0;
    
    	//convert
    	image = SDL_DisplayFormatAlpha(temp);
    	SDL_FreeSurface(temp);
    	if (image==0) return 0;
    
    	//fast with setalpha
    	SDL_SetAlpha(image, SDL_SRCALPHA | SDL_RLEACCEL , 255);
    	return image;
    }
    
    int main(int argc, char** argv)
    {
    	//declare
    	SDL_Surface* screen;
    	SDL_Surface* image;
    	int i;
    	int time;
    
    	//init
    	if (SDL_Init(SDL_INIT_VIDEO)!=0) return 1;
    
    	//screen
    	screen = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
    	if (screen==0) return 1;
    
    	//image
    	image = loadimage("images/move.png");
    	if (image==0) return 1;
    
    	//drawsurface
    	time=SDL_GetTicks();
    	for (i=0; i<100000; i++)
    	{
    		SDL_BlitSurface(image, 0, screen, 0);
    	}
    	SDL_Flip(screen);
    	time=SDL_GetTicks()-time;
    
    	//quit
    	SDL_Flip(screen);
    	SDL_Delay(2000);
    	SDL_Quit();
    	return time;
    }
    


  • Ich glaube die SDL-Blitfunktionen sind alle nicht 3D-beschleunigt
    und daher auch langsamer als OpenGL und D3D, also kein Grund zur Beunruhigung. 😉
    Alpha-Blitting ist bei Direct-Draw außerdem genauso langsam.



  • bei SDL ist schlichweg rein gar nichts 3D beschleunigt. hardware-surfaces zu benutzen ist leider nicht dasselbe, wie den kram tatsächlich mit OGL/D3D zu rendern.



  • Hm also ist SDL unbrauchbar was Grafik angeht... schade...


  • Mod

    ich hoffe du weist, dass diese aussage nicht SDL, sondern nur dich im auge der anderen user diffamiert.



  • TheShadow2000 schrieb:

    Hm also ist SDL unbrauchbar was Grafik angeht... schade...

    soso und warum wird windows xp-schreibtischoberfläche nicht in directx oder openGL angezeigt?



  • ich hoffe du weist, dass diese aussage nicht SDL, sondern nur dich im auge der anderen user diffamiert.

    sorry, dass ich nur hingewiesen habe, dass andere Libs 10x schneller Grafiken malen können... aber das ist dir wohl egal...



  • TheShadow2000 schrieb:

    ich hoffe du weist, dass diese aussage nicht SDL, sondern nur dich im auge der anderen user diffamiert.

    sorry, dass ich nur hingewiesen habe, dass andere Libs 10x schneller Grafiken malen können... aber das ist dir wohl egal...

    nun, DAS hast du nicht gesagt. deine wortwahl gab ungefähr folgenden sinn wieder : SDL ist zu nichts zu gebrauchen also nehmt für jeden aufgabenbereich lieber dx/ogl.

    das entspricht jedoch nicht ganz der wahrheit.



  • SDL ist dafür gedacht wenn du winapi verzichten willst. und es plattformunabhängig haben willst. und dass die grafik auch ohne hardware-beschleunigung funktionieren soll. und es gleichzeitg alles vereinfacht haben willst
    4 vorteile schon mal...

    es gibt diese GUIs z.b. guichan welche auf SDL-Fenster basieren. Aktivierst du OpenGL, sind sie auch 10x schneller.



  • Mal ne Frage dazu...
    Kann man mit SDL so programmieren dass gleichzeitig
    a) 2D aplha blitting & ähnliches ohne hardware beschleunigung nicht langsamer als notwändig wird und
    b) 2D aplha blitting & ähnliches beschleunigt wird sobald OpenGL verfügbar ist
    ?

    Oder muss man dafür 2x Code schreiben?



  • Kann man mit SDL so programmieren dass gleichzeitig
    a) 2D aplha blitting & ähnliches ohne hardware beschleunigung nicht langsamer als notwändig wird und
    b) 2D aplha blitting & ähnliches beschleunigt wird sobald OpenGL verfügbar ist

    also ich konnte keine außergewöhnliche Hardware-beschleuigung entdecken... ich denke die Surfaces werden im VRAM gehalten (was schneller ist) - evtl. werden assembler-optimierte codes genutzt um die schnell zu malen - aber wenn man Alpha haben will mit freier Rotation/Skalierung, dass muß die Engine per 3D-Hardware beschleunigen... das kann SDL scheinbar nicht... es sei man nimmst OpenGL-Lib 😕



  • Also ich muss sagen das png extrem langsam war. Ich hatte mal bmp und dann mal auf png umgestellt und das piel wurde unspielbar. Also blieb ich bei bmp und bei sdl kannst ja ein alpha kanal einstellen.

    schirrmie



  • Zu SDL möchte ich auch mal meinen Senf dazugeben.

    SDL Grafik kann man genau für 2 Sachen gebrauchen:

    1. Plattformunabhängiges reines Software-Rendern. Also wo man direkten Zugriff auf die einzelnen Pixel benötigt weil man z.B. eine Raytracing Engine baut.

    2. Plattformunabhängige OpenGL Programme.

    Dazu kommt man zusätzlich in den Genuss einfacher Eingabe (Tastatur, Maus), Sound, Netzwerk und Routinen zum laden von Grafikdateien.

    Wofür SDL aber absolut ungeeignet ist, ist beschleunigte 2D Grafik(Bilder mahlen mit und ohne Alpha, Linien zeichnen). Dafür muss man andere Libs verwenden. Ich habe z.B. gute Erfahrungen mit wxWidgets gemacht. Ich habe dort sehr schnelle 2D Grafik auf Windows und Linux. Obwohl meiner Linux Kiste keine 3D Treiber hat bzw. dort kein OpenGL funktioniert!




Anmelden zum Antworten