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

31

02.09.2012, 23:27

Das Programm empfängt zum Beispiel zum Beispiel die Nachricht (WM_CLOSE) nicht oder bei Mousestate.IX kommt nicht an um wieviel sich die Maus in x-Richtung bewegt hat.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

32

02.09.2012, 23:29

Was genau hast du jetzt gemacht? Ich dachte, du wolltest dein Programm einfach für so viele Millisekunden schlafen lassen, wie am Ende des aktuellen Frame für die gewünschte Framerate eben noch übrig sind!? Stimmt die Berechnung da? Ich könnte mir vorstellen, dass du dein Programm einfach viel zu lange schlafen legst...

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

33

02.09.2012, 23:30

Das rendern in einem anderen Thread machen. Dann blockiert dein Sleep() nur den Renderthread und der Hauptthread empfängt weiterhin Nachrichten.
Die einfacheren Lösungen (VSync und Frametime) wurden ja schon genannt.

34

02.09.2012, 23:38

Also ich habe folgendes geschrieben

Quellcode

1
2
3
tbResult Render(float fNumSecsPassed){if(bframe)    {   DWORD dword;
    dword=(DWORD)((fframerate-fNumSecsPassed)*1000.0f); 
    Sleep(dword);   bframe=0;   return TB_OK;   }   bframe=1;//renderstuff}


das bedeutet die Methode Render führt sleep() beim ersten Durchgang aus beim 2. jedoch nicht.
Es werden also bei jedem geraden Durchgang die der Rendermethode die sleep()-Methode ausgeführt und bei jedem ungeraden Durchgang der Renderstuff gerendert.
So funktioniert das Programm.
Jedoch finde ich diese Implementierung sehr dilettantisch.
Ich würde gerne eine eleganter Lösung finden.
Ohne diese Behelfskonstruktion mit bool bframe wird keine Windowsnachricht mehr empfangen und ich kann weder das Fenster schließen noch das Programm steuern.

Ich werde jetzt pennen gehen da ich morgen um 7.00 auf die Baustelle muss und ich nur einigermaßen ausgeschlafen arbeiten kann.
Ich bin morgen ab 20:00, wenn nichts dazwischen kommt wieder online.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

35

03.09.2012, 06:47

Zitat von »Nimelrian«

Es ist ein Unterschied, ob eine GPU 3000 Extraframes pro Sekunde rendert, was du ganz schnell an einer riesigen Temperaturerhöhung/Auslastung sehen kannst, oder ob eine CPU 5000 Extraabfragen macht.

Abgesehen davon, wenn du immer eine feste Zeit lang dein Programm schlafen lässt, dann kommt es zu Rucklern, so klein sie auch sind.
Wieso? Weil du zwar immer gleichlang wartest, deine GPU aber unterschiedlich lang für das Rendern unterschiedlicher Frames braucht.

Deswegen nutzt man, soweit mir bekannt, eher die Lösung über if-Abfragen, wie von mir dargestellt.
Tu Dir und uns allen doch einen Gefallen und erzähle nur das, was Du wirklich gelernt hast und nicht das, was Du glaubst. Das ist alles nämlich ziemlicher Unfug und die Quelle schlecht.

Erstens würde die CPU nämlich nicht nur 5000 Abfragen machen, sondern eher 5.000.000.000.000 und somit ebenfalls sinnlos Arbeit verrichten und Leistung nur verbrennen. Zweitens ist das eben keine Lösung, die auch nur irgendein Spiel nutzt, eben weil es keinen Unterschied macht, ob ich die CPU oder die GPU quäle, da es beides Energieverschwendung ist und zusätzlich eine ausgelastete CPU viel schlimmer ist als eine ausgelastete GPU.
Sleep wäre auch nicht die von mir bevorzugte Lösung, lässt sich aber prima umsetzen, unabhängig davon, wie lange es gedauert hat einen Frame zu rendern, denn bei Sleep kann man ja in jedem Frame eine andere Zeitspanne angeben. Ich persönlich wäre eher Fan von Timern. Da muss man allerdings aufpassen, dass er nicht re-entrant ist und dass bei einem gerade so verpassten Timer-Tick dann nicht komplett ein ganzer Frame nur gewartet wird, was auch ziemlich ungut wäre, da das zu Rucklern führt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (03.09.2012, 06:55)


36

03.09.2012, 15:56

Du bist auf jeden Fall unfreundlich.

Ich habe nach einer Lösung gesucht um die framerate zu limitieren. Ich dachte, dass die Mitglieder in diesem Forum über so etwas bescheid wissen und mir eine Lösung mitteilen könnten, da es sich hier um ein simples Standardproblem handelt.

Dabei habe ich mich jedoch geirrt.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

37

03.09.2012, 16:04

Gewöhn dich dran, BlueCobold ist immer ziemlich direkt, aber er weiß, wovon er spricht.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

38

03.09.2012, 16:11

Ich habe nach einer Lösung gesucht um die framerate zu limitieren. Ich dachte, dass die Mitglieder in diesem Forum über so etwas bescheid wissen und mir eine Lösung mitteilen könnten, da es sich hier um ein simples Standardproblem handelt.


Du hast doch jede Menge Vorschläge bekommen?
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

39

03.09.2012, 16:12

Wieso brauchst du diese Unterscheidung zwischen geraden und ungeraden Frames!? Was genau ist fframerate? Falls es sich dabei um die fps handelt, denk nochmal über diese Berechnung der Schlafenszeit nach. Zeit und Frequenz sind umgekehrt proportional, du kannst nicht einfach eine Zeitdauer von einer Frequenz abziehen, das macht rein prinzipiell keinen Sinn.

40

03.09.2012, 18:39

Es gibt neben normalen V-Sync noch eine andere V-Sync Methode: Adaptive V-Sync

Werbeanzeige