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 gutmfg
ShadowEater