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

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

1

09.03.2008, 15:48

Konsolenanwendung 100% lastung entschärfen

zurzeit ist uns bei Tears of Blood aufgefallen, dass die anwendung 100% prozessorleistung in anspruch nimmt.
das liegt an der kontinuierlich durchlaufenden game-loop, welche aufgrund von asynchronen prozessen im spiel einfach notwendig sind. das problem haben wir gelöst erstmal indem wir ein sleep von 5ms in die gameloop packen, doch so richtig glücklich bin ich mit der lösung nicht.

gibt es eventuell eine elegantere lösung?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

09.03.2008, 16:07

Ja, du kannst zum Beispiel für das Sleep einen Wert einstellen, den du als FPS haben willst.

Das habe ich am laufen. Und funktioniert ganz gut. ;)

C-/C++-Quelltext

1
2
3
4
5
        if(m_iMaxFPS > 0)
        {
            if((timeGetTime () - m_dStartTime) <= 1000/m_iMaxFPS)
                Sleep ((DWORD)((1000/m_iMaxFPS) - (timeGetTime () - m_dStartTime))); 
        }


m_dStarttime ist eine Variabel, die du ganz am Anfang per timeGetTime () abfräst, damit du berechnen kannst, wie lange das ganze bereits gedauert hat und den Rest zu deiner gewünschten Framerate mit Sleep ergänzen.

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

09.03.2008, 16:21

joa das hätt ich vllt sagen sollen, in tob haben wir time based rendering ;) also jeder "prozess" wird nur nach eineer bestimmten zeitspanne wieder aufgerufen, das sind die so genannten update-fkt, die monster bewegen usw. ma beispiel

C-/C++-Quelltext

1
2
3
4
5
6
7
8
while (!bEnde)
{
    player->update(135); //alle 135 ms wird update durchgeführt

    player->draw(false);

    npcmanager->update(50);
    npcmanager->draw();
}


so ungefähr.

deswegen passst die idee nicht so wirklich, die zeit haut schon hin, geht nur um die prozessorleistung, trotzdem danke ;).

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

09.03.2008, 16:27

Viel anders wirst du es nicht hinbekommen. Zeit kann man, soweit ich weiß, nur durch Funktionen wie Sleep abgeben.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

09.03.2008, 16:29

Hmm. Dan versteht ich dein Problem nicht ganz.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
while (!bEnde)
{
    player->update(135); //alle 135 ms wird update durchgeführt

    player->draw(false);

    npcmanager->update(50);
    npcmanager->draw();

   Sleep (5) //Du hast z.B noch 5 ms Zeit,in der du nichts machst, also warten

}


Wenn du sagst, dass nur alle 135 ms gerendert wird, was macht er dann in der restlichen Zeit? - In der Schlaufe rumgurken..oder?

Und da kannst du dennoch eine Framesperre reinbauen.

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

09.03.2008, 16:50

Zitat von »"drakon"«

Wenn du sagst, dass nur alle 135 ms gerendert wird


ja du hast mein problem nicht verstanden ;)

es wird alle 135 ms geupdatet, das heisst, z. b. der npc bewegt(also nur die daten in dem objekt angepasst). das rendern passiert jedes frame mit der jeweiligen Draw-Methode. wenn du das ohne diese time based sache machst, dann flizt der über den bildschirm.

dann wäre auch eventuell deine lösung in ordnung, hat aber einen gravierenden nachteil: wenn was rechenaufwnediges reinkommt (wir haben vor a* einzubauen), dann kann unter umständen das programm durch das framebremsen verlangsamt werden, weil einfach schon die methoden soviel zeit brauchen, dasss das sleep es noch zusätzlich verlangsamt. eigentlich frei danch man sollte sleep lassen wenns geht, weils weggeworfene rechenzeit ist.

vielleicht ist auch dieser ansatz von mir gerade das problem. also eigentlich denke ich, dass wenn es wirklich keine bessere lösung gibt, dass das mit den 5ms noch vertretbar ist, da dann nur minimale abweichungen sind wenn der rechenaufwandt steigt.

weil es ja primäar darum geht die prozessorlastung zu vermindern. da nox gesagt hat, das wird nicht besser gehen, will ich ihm das mal glauben.

auch ist diese sache denke ich eine stilfrage drakon ;)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

09.03.2008, 17:29

Zitat

es wird alle 135 ms geupdatet, das heisst, z. b. der npc bewegt(also nur die daten in dem objekt angepasst). das rendern passiert jedes frame mit der jeweiligen Draw-Methode. wenn du das ohne diese time based sache machst, dann flizt der über den bildschirm.


Also jetzt rein aus Interessenshalber: Was spricht den gegen die Version mit der Zeit, die vergangen ist und dann hald mit in die Bewegung mit einbezogen wird? Da würde das mit dem Sleep ja auch gehen. Ihr habt bestimmt eure Gründe, aber ich blick da grad nicht durch. ;)

8

09.03.2008, 20:32

Zitat von »"drakon"«


Also jetzt rein aus Interessenshalber: Was spricht den gegen die Version mit der Zeit, die vergangen ist und dann hald mit in die Bewegung mit einbezogen wird? Da würde das mit dem Sleep ja auch gehen. Ihr habt bestimmt eure Gründe, aber ich blick da grad nicht durch. ;)

Genau so mache ich das auch und es funktioniert wunderbar.
Da ich kein Sleep habe, springt nach kurzer Zeit mit hohen fps mein Lüfter an, wenn ich allerdings VSYNC einschalte und dann konstant 60fps habe, bleibt alles ruhig.
Lieber dumm fragen, als dumm bleiben!

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

9

09.03.2008, 21:30

ich verwende meist einfach solch eine messageschleife

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
while(msg.message != WM_QUIT)
{
if(PeekMessage)
{
//verarbeiten
}
else
{
//z.B. Rendern...

Sleep(0);
}
}

Werbeanzeige