SDL + OpenGL Programmausführung sehr langsam.



  • Hi Leute,

    ich bin noch Neuling was Grafiksachen anbelangt, also net bös sein wenn ich was einfaches falsch gemacht hab. In der FAQ hab ich auch gesucht aber nichts passendes gefunden 😞

    Zum Problem: Ich hab ein kleines Programm mit OpenGL und SDL geschrieben welches eine Textur auf ein rechteck legt und dieses um die Y-Achse dreht.
    Unter Linux funktioniert das super, flüssig, schnell und die Farben der BMP werden richtig angezeigt. 🙂
    Aber unter Windows ruckelt die Animation extrem und braucht für eine Umdrehung fast 1 Min 😞 !!! Bei Linux etwa 5 Sek. 🙂 .
    Ich nutze Windows XP, M$Visual C++ 6 und eine nVidia 6800 Ultra (btw. auch den neuesten Treibet installiert !). Ich habe das ganze als Win32 Projekt (leeres Projekt) und als Consolen Projekt versucht... . Beides klappt nicht richtig, beide weisen das gleiche fehlerhafte Verhalten auf !

    Unter Projekteinstellungen --> Linker --> Objekt-/Bibliothek-Module: opengl32.lib glu32.lib glaux.lib (am Anfang der Zeile)
    sdl.lib sdlmain.lib (am Ende der Zeile)

    Hier mein kleiner Code:

    #include <windows.h>		// Header File For Windows
    #include <stdio.h>
    #include <GL\gl.h>
    #include <GL\glu.h>
    #include <GL\glaux.h>
    #include <SDL\SDL.h>
    
     #ifdef _WIN32
     #undef main
     #endif
    
    GLuint texture[1];
    
    int LoadGLTextures( )
    {
      /* Status indicator */
      int Status = 0;
    
      /* Create storage space for the texture */
      SDL_Surface *TextureImage[1];
    
      /* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */
      if ( ( TextureImage[0] = SDL_LoadBMP( "data/nehe.bmp" ) ) )
        {
    
          /* Set the status to true */
          Status = 1;
    
          /* Create The Texture */
          glGenTextures( 1, &texture[0] );
    
          /* Typical Texture Generation Using Data From The Bitmap */
          glBindTexture( GL_TEXTURE_2D, texture[0] );
    
          /* Generate The Texture */
          glTexImage2D( GL_TEXTURE_2D, 0, 3, TextureImage[0]->w,
    		    TextureImage[0]->h, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->pixels );
    
          /* Linear Filtering */
          glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
          glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
        }
    
      /* Free up any memory we may have used */
      if ( TextureImage[0] )
        SDL_FreeSurface( TextureImage[0] );
    
      return Status;
    }
    
    int main()
    {
      float angle=0;
      int i;
      if (SDL_Init (SDL_INIT_VIDEO)!=0)
        {
          printf ("Error: %s\n", SDL_GetError ());
          return 1;
        }
      atexit (SDL_Quit);
      SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 16);
      SDL_GL_SetAttribute (SDL_GL_RED_SIZE, 5);
      SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 6);
      SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5);
    
      if (SDL_SetVideoMode (640, 480, 16, SDL_OPENGL|SDL_HWSURFACE|SDL_DOUBLEBUF)==NULL)
        {
          printf ("Error: %s\n", SDL_GetError ());
          return 1;
        }
      SDL_WM_SetCaption ("OpenGL with SDL!", "OpenGL");
      glViewport (80, 0, 480, 480);
      glMatrixMode (GL_PROJECTION);
      glLoadIdentity ();
      glFrustum (-1.0, 1.0, -1.0, 1.0, 1.0, 100.0);
      glClearColor (0, 0, 0, 0);
      glMatrixMode (GL_MODELVIEW);
    
      LoadGLTextures ();
      glEnable (GL_TEXTURE_2D);
      /*  glShadeModel (GL_SMOOTH); */
    
    for (i=0;i<360*10*3;i++)
      {
        angle=(i/10)%360;
        glLoadIdentity ();
        glClear (GL_COLOR_BUFFER_BIT);
        glTranslatef (0, 0, -2);
        glRotatef (angle, 0, 1, 0);
        glBegin (GL_QUADS);
    
       // glColor3f (1, 0, 0);
        glTexCoord2f (0, 0); glVertex3f (-1, -1, 0);
       // glColor3f (0, 1, 0);
        glTexCoord2f (1, 0); glVertex3f (1, -1, 0);
       // glColor3f (1, 1, 0);
        glTexCoord2f (1, 1); glVertex3f (1, 1, 0);
       // glColor3f (0, 0, 1);
        glTexCoord2f (0, 1); glVertex3f (-1, 1, 0);
    
        glEnd ();
        SDL_GL_SwapBuffers ();
      }
      glFlush ();
      // SDL_Delay (1000);
      return 0;
    }
    

    Ich versuch schon seit Tagen das Problem zu beheben und nun bin ich mit meinem Latein am Ende 😞 😕 😕 😕

    Bitte helft mir 🙂

    Vielen Dank für eure Muhe und Hilfe vorab
    😉
    ShadowEater



  • SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 16);
    

    16?

    SDL_GL_SetAttribute (SDL_GL_RED_SIZE, 5);
      SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 6);
      SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5);
    

    Was passiert da, wenn die Grafikkarte nun zb nur A1R5G5B5 kann?

    Und der Z-Buffer interessiert dich gar nicht?



  • Hi hellihjb,

    SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 16);

    hab ich auf 1 gesetzt.

    Was passiert da, wenn die Grafikkarte nun zb nur A1R5G5B5 kann?

    grün hab ich auch auf 5 gesetzt!

    Hilft aber leider nichts, gibt es irgendwo ein Tut das die Verwendung von SDL + OpenGl beschreibt, auch die Einbindung der GrafikApis, oder wenn es nicht zuviel verlangt ist und Du ein bißchen Zeit hast könntest Du die paar Zeilen Code aktiv korrigieren und mal gucken ob die paar Zeilen auf Deinem System funktionieren?
    Ich glaub ich hab schon alles ausprobiert was geht und seh den Wald vor lauter Bäumen nicht mehr 😕 !

    Wäre echt super nett von Dir, so ein mit SDL und OpenGl funktionierender code wär bestimmt auch was für die FAQ!

    Vielen dank für Deine Mühe und Hilfe vorab 😉
    ShadowEater 🙂



  • Ich habe Deinen (unveraenderten) Source von oben genommen, SDL-1.2.8 eingebunden, 'ne Textur (256x256 RGB24) in den "./data"-Ordner gelegt und das Quadrat rotiert zuegig und fehlerfrei.



  • Suuper hellihjb,

    hast Du eine Konsolenanwendung oder ein Win32 Projekt (leer) genutzt.
    Hast Du mit M$VC++ 6.0 compiliert.?

    Vieln, vielen Dank für Deine Mühe
    Gruß
    ShadowEater



  • ShadowEater schrieb:

    Suuper hellihjb,

    hast Du eine Konsolenanwendung oder ein Win32 Projekt (leer) genutzt.
    Hast Du mit M$VC++ 6.0 compiliert.?
    Und wie hast Du das Einbinden genau vorgenommen?

    Vieln, vielen Dank für Deine Mühe
    Gruß
    ShadowEater



  • P.S.: Hier steht aber was von Version SDL-devel-1.2.13-VC6.zip für (Visual C++ 6.0)

    http://www.libsdl.org/download-1.2.php

    😕 😕 😕

    Dann mach ich mich mal auf die Suche nach Deiner Version !
    Gruß
    ShadowEater



  • P.P.S.Was für OpenGl versionen verwendest Du ?

    Gruß
    ShadowEater



  • Ich benutze Visual Studio 2005 (Projekt fuer Win32 Konsolenanwendung).
    Mit VC6 funktioniert's genauso gut.
    SDL-1.2.8 hatte ich halt noch auf der Platte.
    OpenGL-header/libs sind beim Compiler dabei (bzw im Platform-SDK).
    Fuer mich hoert sich das so an, als wenn Du keine Hardware-Beschleunigung haettest...

    edit:
    Hab's nochmal mit 1.2.13 versucht und geht auch.
    Ich habe keinen Schimmer wo Dein Problem liegt.
    Vielleicht hat ja jemand anderes 'ne Idee dazu.



  • AHA, und wie schalt ich die Hardwarebeschleunigung ein bzw. wie find ich heraus ob sie eingeschaltet ist oder nicht?

    Vielen Dank für Deine Unterstützung
    ShadowEater



  • Hi hellihjb,

    aber alle anderen 3D Sachen z.b. Spiele funktionieren !

    gruß
    ShadowEater



  • P.S.: Hab die Hardwarebeschleunigung gefunden, die steht auf maximal !

    Gruß
    ShadowEater



  • lass doch dieses attribut-zeugs mal weg und setz bei SDL_SetVideoMode fuer bpp 0.



  • Hi hellihjb,

    habs gefunden, war ein simpler Codingfehler.
    Ich bin über 10.000 Mal in diese Schleife gesprungen:

    for (i=0;i<360;i++)
      {
        glLoadIdentity ();
    
        glClear (GL_COLOR_BUFFER_BIT);
        glTranslatef (0, 0, -2);
        glRotatef (i, 0, 1, 0);
    

    und hab das Rotieren mit einem sehr kleinen Floatwert durchgeführt.
    Kein Wunder dass es nicht richtig lief!

    Mit dem obigen Code klappts problemlos!

    Sag mal kennst Du / Ihr Tuts, Worshops und Bücher die sich speziell mit dem Thema >>> OpenGl + SDL << also dem Zusammenspiel der beiden befassen?

    Gruß
    ShadowEater



  • Bitte korrigiere mal noch den Titel. Danke!



  • 😉 🤡 😃



  • war ein simpler Codingfehler [..] bin über 10.000 Mal in diese Schleife gesprungen

    Und warum hast Du nicht einfach den Code gepostet der auch einen Fehler enthaellt?!



  • Hab ich doch, gleich in meiner ersten Mail 😉

    Gruß
    ShadowEater 🙂



  • Keine Deiner Fehlerbehebungsmassnahmen laesst sich in Deinem urspruenglichen Source nachvollziehen.
    Es scheint so, als haettest Du funktionsfaehigen (aber angeblich fehlerhaften) Code gepostet um Leute von wichtigeren Dingen abzuhalten.



  • Tut mir leid wenn ich es Dir so direkt sagen muss aber laber bitte keinen solchen provokanten 😡 Sch...! 🙄

    Wenn da kein Fehler drin ist den Du finden kannst, umso besser, aber durch die Änderungen die ich vorgenommen habe (s. prev. Post) wurde der Code schneller!

    In einem Hardwareforum hat man mir ebenfalls Tipps gegeben die auf einige fehlerhafte Treibereinstellungen hinwiesen.
    Beides zusammen beschleunigte die Sache auf ein normales Level.
    Da ich bei Ogl noch Anfänger bin ist es wohl normal dass ich so etwas poste, dafür ist ein Forum da.
    Also bitte überleg Dir das nächste mal was Du so schreibst bevor Du Leute einfach so beleidigst.
    Ich schreibs der Hitze gut 😉

    mfg
    ShadowEater


Log in to reply