SDL + OpenGL + Linux -> viel zu langsam



  • Hi Leute.
    Ich habe jetzt mal ein kleines Programm mit SDL + OpenGL unter Linux geschrieben.
    Zum Testen gebe ich bei jeder Mausbewegung eine kurze Info aus. Dadurch habe ich auch mitbekommen, dass die Info erst ca. 1 Sekunde nach der Bewegung ausgegeben wird. Heisst, dass die "Nachricht" (dass die Maus bewegt wurde) viel zu langsam verarbeitet oder empfangen oder sonst was wird... 😞
    Die Schleife sieht folgendermassen aus:

    while( !Done )
    	{
    		glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    		glLoadIdentity();
    		Cam.Look();
    		glRotatef( c, 0.0f, 1.0f, 0.0f );
    		c += 1.0f;
    		DrawGLScene();
    		SDL_GL_SwapBuffers();
    
    		while( SDL_PollEvent( &Event ) )
    		{
    			switch( Event.type )
    			{
    				case SDL_MOUSEMOTION:
    					cout << c << " MOUSEMOTION" << endl;
    					Cam.SetViewByMouse( Event.motion.x, Event.motion.y, 320, 240, 0, 0, false, false );
    					break;
    
    				case SDL_QUIT:
    					Done = true;
    					break;
    
    				case SDL_KEYDOWN:
    					if( Event.key.keysym.sym == SDLK_ESCAPE )
    					{
    						Done = true;
    					}
    					break;
    			}
    		}
    
    	}
    

    MOUSEMOTION und die Zahl davor werden also erst ca. 1 Sekunde nach der eigentlichen Mausbeweungen ausgegeben. Heisst, dass sich die Kamera auch erst 1 Sekunde nach der Bewegung dreht... 😞
    Warum dauert das so lange und wie macht man es besser?
    Weiss jemand Rat?
    MfG Aoeke

    EDIT: Ich habe mal den Titel veraendert.[/b]



  • Ich würde einfach vor jedem frame abfragen wie weit sich die maus relativ zur letzten position bewegt hat (das geht mit SDL irgendwie), anstatt das mit events zu machen.



  • OK, habe ich jetzt so versucht.
    Code:

    while( !Done )
    	{
    		glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    		glLoadIdentity();
    		Cam.Look();
    		glRotatef( c, 0.0f, 1.0f, 0.0f );
    		c += 1.0f;
    		DrawGLScene();
    		SDL_GL_SwapBuffers();
    
    		while( SDL_PollEvent( &Event ) )
    		{
    			switch( Event.type )
    			{
    				case SDL_QUIT:
    					Done = true;
    					break;
    
    				case SDL_KEYDOWN:
    					if( Event.key.keysym.sym == SDLK_ESCAPE )
    					{
    						Done = true;
    					}
    					break;
    			}
    		}
    
    		SDL_GetMouseState( &MouseX, &MouseY );
    		Cam.SetViewByMouse( MouseX, MouseY, WinWid/2, WinHei/2, 0, 0, false, false );
    	}
    

    Der ist trotzdem noch so langsam... 😞 Also lags wohl nicht an der Nachrichtenverarbeitung.. Die Funktion (SetViewByMouse) ansich durchlaeuft er relativ schnell... Nur es liegt immer eine groessere Zeitspanne zwischen den Funktionsaufrufen...
    Plz help...
    MfG Aoeke



  • Ich nochmal:
    Ich habe jetzt rumprobiert und herausgefunden, dass er bei der Ausfuehrung der folgenden beiden Funktionen ewig lange braucht.

    glClear( GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT );
    /* ... */
    SDL_GL_SwapBuffers();
    

    Warum braucht der da so unendlich lange fuer? 😞
    MfG Aoeke



  • Ich würde das mal etwas umorganisieren.

    Erst die Input-Abfrage, danach das Rendering.

    Und das Löschen/Swappen des Framebuffers dauert halt seine Zeit.

    cya
    liquid



  • LiquidAcid schrieb:

    Und das Löschen/Swappen des Framebuffers dauert halt seine Zeit.

    Ja aber jedesmal 1 Sekunde? Dann koennte ja kein Spiel unter Linux ordentlich laufen. 😞
    MfG Aoeke



  • Wie lang dauert denn das Clear? Und wie lang das Swapping?

    Bitte mal beides getrennt testen.
    Wenns Clear so lang dauert, dann kanns an der Pixelformat Einstellung liegen.

    cya
    liquid



  • Genaue Zeiten kann ich dir momentan nicht sagen. Ich habe aber schon beides seperat getestet. Dabei kam heraus, dass er fuer das Swapping ein bisschen weniger Zeit benoetigt, als fuer das Loeschen der Buffer. Also, wenn beides zusammen ca. 1 Sekunde dauert, dann ungefaehr 0.6 Sekunden fuers Loeschen und 0.4 Sekunden fuers Swapping.
    MfG Aoeke



  • Ich denk mal, dann liegt das an irgendwelchen Fehlerhaften Einstellungen die du getroffen hast. Bei mir laufen normale Anwendungen unter Linux mit SDL und OpenGL ohne das ich was rendere mit ca 500fps (also werden clear und swap 500 mal pro Sekunde ausgeführt).



  • morphis schrieb:

    Ich denk mal, dann liegt das an irgendwelchen Fehlerhaften Einstellungen die du getroffen hast.

    Und wie weiss man als Linux-Einsteiger, ob und welche fehlerhafte Einstellungen ich getroffen habe?? 😞
    MfG Aoeke



  • OK. Ich habe den Fehler gefunden. Allerdings war der programmierbedingt.
    Und zwar habe ich zufaellig bei Google gelesen, dass man bei Linux immer mit dem Befehl 'glFinish' arbeiten soll. Den habe ich dann einfach mal reingesetzt und siehe da, es lief... 😃
    Danke fuer eure Hilfe.
    MfG Aoeke


Anmelden zum Antworten