Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

24.11.2012, 13:45

C++ - OpenGL - Umstieg von der WinApi auf SDL - Kleine Lauffehler

Guten Tag Community!
Und wie immer habe ich ein paar Fragen zur Programmierung bzw. Optimierung meines bereits vorhandenen Programmes.
Also, da mich die WinApi aufgrund der WinProc etwas verärgert hat, bin ich nun auf SDL umgestiegen. Der Umstieg fiel mir leicht, da viele komplexe Codestrukturen nun einfacher aufgebaut sind und viel Unnötiges entfallen ist. Leider haben sich wohl beim Umstieg Fehler eingeschliechen, die ich leider bisher noch nicht entdecken konnte. Ich hoffe und glaube, dass sie einigen von euch bekannt sein könnten. Und zwar wenn ich das Programm starte, ist für etwa 1-3 Sekunden der Fensterinhalt durchsichtig. Und das zweite wäre eher eine Frage: Wie kann ich die Frames per Second limitieren?

Hier der Setup:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
CGame::CGame()
{
    SDL_Init(SDL_INIT_EVERYTHING);
    screen=SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_SWSURFACE|SDL_OPENGL);

    enableOpenGL();
}

CGame::~CGame()
{
    if(level != NULL)
        delete level;
    SDL_Quit();
}

void CGame::enableOpenGL()
{
    //Initializing openGL
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0, 0, 800, 600);
    gluPerspective(45.0, 800/600, 1.0f, 500.0f);

    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    float dif[] = {1.0f, 1.0f, 1.0f, 1.0f};
    glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
    float amb[] = {0.05f, 0.05f, 0.05f, 1.0f};
    glLightfv(GL_LIGHT0, GL_AMBIENT, amb);

    //level
    level = new CLevel();
}

void CGame::display()
{
    glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();               
    //CCamera
    cam.control(1.0f);
    level->drawSky();//draw the sky before the translations+scalations!(but don't forget,rotation has to be done)}
    cam.update();
    //Light
    float pos[] = {25.0f, 25.0f, -25.0f, 1.0f};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);


    drawAxis();
}

void CGame::loop()
{
    running = true;
    enableOpenGL();
    SDL_Event sdlEvent;
    while (running)
    {
        eventHandling(sdlEvent);

        display();

        SDL_GL_SwapBuffers();
    }
}


Vielen Dank für eure Hilfe und den Zeitaufwand

lg. denniro
Only God can judge me.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

24.11.2012, 13:52

Ich kann dir leider bei deinem SDL Problem nicht helfen, da ich mit SDL überhaupt keine Erfahrung hab, aber mich würde interessieren, inwiefern die WinAPI dich "verärgert" hat. Abgesehen davon, wollte ich darauf hinweisen, dass das if(level != NULL) vor dem delete level; sinnlos ist, da delete 0; per Definition einfach nichts tut. Ich würde mir überhaupt die Frage stellen, wieso level eigentlich per new erzeugt werden muss und nicht einfach ein normaler Member sein kann. Und wenn, dann würde ich zur Verwendung von std::unique_ptr raten.
NULL ist übrigens ein Artefakt aus C; in C++ sollte man besser nullptr verwenden.

Btw: SDL ist imo ziemlicher Overkill, wenn es nur darum geht, ein OpenGL Fenster zu erzeugen...

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (24.11.2012, 14:00)


3

24.11.2012, 14:05

Ich kann dir leider bei deinem SDL Problem nicht helfen, da ich mit SDL überhaupt keine Erfahrung hab, aber mich würde interessieren, inwiefern die WinAPI dich "verärgert" hat. Abgesehen davon, wollte ich darauf hinweisen, dass das if(level != NULL) vor dem delete level; sinnlos ist, da delete 0; per Definition einfach nichts tut. Ich würde mir überhaupt die Frage stellen, wieso level eigentlich per new erzeugt werden muss und nicht einfach ein normaler Member sein kann. Und wenn, dann würde ich zur Verwendung von std::unique_ptr raten.

Btw: SDL ist imo ziemlicher Overkill, wenn es nur darum geht, ein OpenGL Fenster zu erzeugen...


Zuerst zur Abfrage ob level ungleich NULL ist: Das wusste ich nicht, dass delete 0; nichts tut. Ich dachte, dass der Compiler dann rumspacken würde :D Danke für den Tipp.

Ich habe mich vielleicht falsch ausgedrückt, um genau zu sein, hat mich die WndProc verärgert. Es fing dabei an, dass ich alles schön in Klassen verpacken wollte und danach auf einen Fehler gestoßen bin. Diesen Fehler versuchte ich auszubügeln, doch er wurde zuerst besser aber daraufhin haben einige Funktionen nicht so funktioniert, wie sie sollten, da der Speicherplatz vermüllt war. Mehr kannst du hier nachlesen.

lg. denniro

EDIT: Wenn level ein statischer Member ist, so läd die Skybox nicht richtig(besser gesagt die Texturen).
Only God can judge me.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »denniro« (24.11.2012, 14:23)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

24.11.2012, 14:18

Ich habe mich vielleicht falsch ausgedrückt, um genau zu sein, hat mich die WndProc verärgert. Es fing dabei an, dass ich alles schön in Klassen verpacken wollte und danach auf einen Fehler gestoßen bin. Diesen Fehler versuchte ich auszubügeln, doch er wurde zuerst besser aber daraufhin haben einige Funktionen nicht so funktioniert, wie sie sollten, da der Speicherplatz vermüllt war. Mehr kannst du hier nachlesen.

Also der Thread liest sich jetzt mal so, als ob das Problem eindeutig nicht an der WinAPI sondern an deren Benutzung liegt. Ich hab dir dort mal eine Antwort gepostet... ;)

5

24.11.2012, 14:25

Ich habe mich vielleicht falsch ausgedrückt, um genau zu sein, hat mich die WndProc verärgert. Es fing dabei an, dass ich alles schön in Klassen verpacken wollte und danach auf einen Fehler gestoßen bin. Diesen Fehler versuchte ich auszubügeln, doch er wurde zuerst besser aber daraufhin haben einige Funktionen nicht so funktioniert, wie sie sollten, da der Speicherplatz vermüllt war. Mehr kannst du hier nachlesen.

Also der Thread liest sich jetzt mal so, als ob das Problem eindeutig nicht an der WinAPI sondern an deren Benutzung liegt. Ich hab dir dort mal eine Antwort gepostet... ;)


Okey danke!
Ich werde mir dann nachher die Mühe machen und nochmal zurück auf die WinApi greifen(es muss wieder alles umgeschrieben werden).

lg. denniro
Only God can judge me.

6

24.11.2012, 17:25

So ich habe nun auf die WinApi zurückgegriffen, leider besteht das Problem mit dem "vermüllten Speicherplatz" weiterhin.
Ich bitte im alten Thread um Rat.

URL:
C++ - Win32 - OpenGL - Zugriffsverletzung - Unklarheiten
Only God can judge me.

Werbeanzeige