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

27.06.2009, 20:01

Verständnisprobleme

Nabend!

Kurze Vorgeschichte:
Ich beschäftige mich derzeit mit OpenGL, habe mit Nehes Tutorials
angefangen, bis Glaux verwendet wurde. Da ich Glaux nicht verwenden
will, habe ich mir ein anderes Tutorial gesucht.
Das Tutorial ist auch relativ lang und auch eher für Fortgeschrittene.

Vom ersten Part verstehe ich ja auch schon eine Menge, aber es gibt so
Sachen da blicke ich nicht durch. Vielleicht liegts an dem vollem Kopf, dem
Stress und der ständigen Depression durch einen fehlgeschlagenen Versuch
es zu verstehen.

Hier erst einmal die Funktion:

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
void CApplication::Run()
{
  // Als erstes das Fenster erstellen

  CMainWindow mainWindow(800,600,m_bFullScreen);

    MSG Message;
    Message.message = (~WM_QUIT);
    DWORD dwNextDeadLine = GetTickCount() + FRAME_TIME;
    DWORD dwSleep = FRAME_TIME; // FRAME_TIME als "75" definiert

    bool bUpdate = false;

  //Schleife, bis eine Nachricht WM_QUIT erhalten wird, also das Fenster

  // zu schließen

    while (Message.message != WM_QUIT)
    {
    // Wait until a message comes in or until the timeout expires. The

    // timeout is recalculated so that this function will return at

    // least every FRAME_TIME msec.

    DWORD dwResult = MsgWaitForMultipleObjectsEx(0,NULL,dwSleep,QS_ALLEVENTS,0);
    if (dwResult != WAIT_TIMEOUT)
    {
      // If the function returned with no timeout, it means that at 

      // least one message has been received, so process all of them.

      while (PeekMessage(&Message, NULL, 0, 0, PM_REMOVE))
      {
        // If a message was waiting in the message queue, process it

        TranslateMessage(&Message);
        DispatchMessage(&Message);
      }

      // If the current time is close (or past) to the 

      // deadline, the application should be processed.

      if (GetTickCount() >= dwNextDeadLine)
        bUpdate = true;
      else
        bUpdate = false;
    }
    else
      // On a timeout, the application should be processed.

      bUpdate = true;

    // Check if the application should be processed

    if (bUpdate)
    {
      DWORD dwCurrentTime = GetTickCount();
      // Fenster updaten

      mainWindow.Update(dwCurrentTime);
      // Fenster "zeichnen"

      mainWindow.Draw();

      dwNextDeadLine = dwNextDeadLine + FRAME_TIME;
    }

    // Process the sleep time, which is the difference

    // between the current time and the next deadline.

    dwSleep =  dwNextDeadLine - GetCurrentTime();
    // If the sleep time is larger than the frame time,

    // it probably means that the processing was stopped 

    // (e.g. the window was being moved,...), so recalculate

    // the next deadline.

    if (dwSleep>FRAME_TIME)
    {
      dwSleep = FRAME_TIME;
      dwNextDeadLine = GetCurrentTime() + FRAME_TIME;
    }
  }
}


Ok, einige Kommentare sind in Deutsch und in Englisch.
Was ich nicht verstehe, ist einmal folgende Zeile:

C-/C++-Quelltext

1
    Message.message = (~WM_QUIT);


Besser gesagt, das "~". Wird die Nachricht nun nicht auf WM_QUIT gesetzt?

Den ganzen Timeout und Deadline Kram verstehe ich nicht.

Wenn mir den vielleicht jemand mal erklären könnte? : )

Achso, und DWORD könnte man doch auch mit unsigned int vertauschen
oder? :?:

Vielen Dank für eure Hilfe!
MfG Shiver!

„Ideen sind nur Ausgangspunkte. Um zu wissen, was man zeichnen will, muss man zu zeichnen anfangen.“ Pablo Picasso

Ibot Development - Mein Weg zum eigenen 2D RPG

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

27.06.2009, 20:23

Re: Verständnisprobleme

Zitat von »"Shiver"«

Ok, einige Kommentare sind in Deutsch und in Englisch.
Was ich nicht verstehe, ist einmal folgende Zeile:

C-/C++-Quelltext

1
    Message.message = (~WM_QUIT);


Besser gesagt, das "~". Wird die Nachricht nun nicht auf WM_QUIT gesetzt?


Das ~ ist ein bitweises nicht. Das tut der nur um sicherzustellen dass die Bedingung in der folgenden Zeile:

C-/C++-Quelltext

1
while (Message.message != WM_QUIT)


Auf keinen Fall true wird bevor noch irgendeine Nachricht verarbeitet wurde.


Zitat von »"Shiver"«

Den ganzen Timeout und Deadline Kram verstehe ich nicht.


Das is nix andres als ne Framebremse. Er sagt jeder Frame soll 75 ms dauern. Wenn er schneller fertig ist dann legt er sich schlafen und wartet dass entweder die 75ms um sind oder eine Nachricht eintrifft die er verarbeiten muss...

Zitat von »"Shiver"«

Achso, und DWORD könnte man doch auch mit unsigned int vertauschen
oder? :?:


DWORD steht für Double Word, also 4 Byte. DWORD ist immer so definiert dass es unsigned und 4 Byte groß ist, die Größe eines unsigned int hingegen ist nicht garantiert (auf x86 normal 4 Byte, abhängig vom Compiler wäre ein int aber auf einem x64 System z.B. 8 Byte groß, also ein QWORD)...

3

30.06.2009, 18:49

Vielen Dank!
MfG Shiver!

„Ideen sind nur Ausgangspunkte. Um zu wissen, was man zeichnen will, muss man zu zeichnen anfangen.“ Pablo Picasso

Ibot Development - Mein Weg zum eigenen 2D RPG

Werbeanzeige