Flip frage

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

kog

Betreff: Flip frage

BeitragMi, Okt 31, 2012 23:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten tag zusammen.

Seit einem Beitrag in einem anderen Thread bin ich ziemlich verunsichert, was es nun zu bedeuten hat:

Zitat:
Und wegen einem muss ich dich schlagen: Mein pc hat hier grade 1200fps ausgespuckt. Nicht das ich da was gegen hätte, aber... Du hast grade die lebensdauer meines pc's kürzer gemacht als nötig *hihi* WaitTimer() *grins* (und bloß kein flip 1! aber du scheint eh 0 drin zu haben )


Sollte man nun Flip 0 benutzen mit einem Timer, oder reicht Flip 1.

Ich Programmiere z.b. auch oft mit Flip 0, ohne Timer jedoch mit Deltatiming abgestimmt auf 60 fps.


ist nun irgend eine Variante schädlich für den PC?


mfg
k.o.g.
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

BtbN

BeitragDo, Nov 01, 2012 0:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ein PC von 100% CPU auslastung auf einem Kern schaden nimmt, ist er schlecht gebaut.

kog

BeitragDo, Nov 01, 2012 0:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Deinem Text nach, muss man demnach keine bedenken bei Flip 1 oder was auch immer haben?
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

Xeres

Moderator

BeitragDo, Nov 01, 2012 0:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Der uralte Unsinn...
Arrow Hurra, 100 % Auslastung
Kurz gesagt: Timer + Flip(0)
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Holzchopf

Meisterpacker

BeitragDo, Nov 01, 2012 0:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch sollte man, weil niedrigere CPU-Auslastung auch niedrigere Energieaufnahme bedeutet. Da steckt ein ökologischer Gedanke dahinter.

Kurzes Erklärdingens:
Bei Flip 1 geht das Programm in eine Schleife über, die so lange abgearbeitet wird, bis der Bildaufbau die letzte Pixelzeile erreicht hat, danach werden Front- und Backbuffer geflippt. Diese Schleife wird ungebremst ausgeführt - das Programm nimmt sich einfach die Rechenleistung die es kriegt und die Folge davon ist, dass die CPU-Auslastung steigt, i.d.R. bei einem Kern auf 100%.
Bei Flip 0 werden Front- und Backbuffer bedingungslos geflippt, was zwar in einigen Fällen zu negativ auffallenden Grafikfehlern führen kann (die wiederum durch geschicktes Tüfteln nahezu eliminiert werden können), aber keine weitere CPU-Leistung frisst. ABER: Mit Flip 0 alleine würde der Bildaufbau so oft gemacht, wie deine Hardware halt hergibt (das können dann gut und gerne mal über 1000 Mal pro Sekunde sein) und somit wäre die Ersparnis vernichtet und zudem auch noch der Grafikchip im roten Bereich. Deshalb gehört zum Flip 0 immer ein WaitTimer. Der Timer bremst das Programm aus (nur, wenn nötig) und ist somit Regulator zwischen Hardwareauslastung und Spielkomfort - soweit ich weiss, brauchen Action-Spiele 50-60Hz, um gut spielbar zu sein, während Denk-, Knobel- und rundenbasierte Spiele auch mal mit 20Hz noch auskommen. Bei WaitTimer geht das Programm nicht in eine "Endlos"-Schleife, sondern in einen Wartezustand über, aus dem es vom System erlöst wird, wodurch keine zusätzliche Rechenpower beansprucht wird.

mfG
Holzchopf

edit
Mann, Xeres!
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

count-doku

BeitragDo, Nov 01, 2012 10:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte korrigiert mich, wenn ich falschliege, aber kann man bei Graphics nicht schon nen Aktualisierungsintervall
festlegen und dann später Flip -1 verwenden? Zumindest unter Bmax scheint es zu funktionieren,
habe gerade mal verschiedene möglichkeiten durchprobiert.

Timer per Graphics mit Flip -1:
BlitzMax: [AUSKLAPPEN]
Graphics 400, 300, 0, 30

While Not KeyHit(KEY_escape)
Cls
DrawRect 10, 10, 20, 20
Flip -1

Wend
End
Gibt lt. Taskmgr 1% CPU last. Ginge damit.
Vollbild: Komischerweise 60FPS, Hertz Angabe bei Graphics scheint im Vollbild problematisch. CPU 1%

Einfach flip 0
BlitzMax: [AUSKLAPPEN]
Graphics 400, 300, 0, 0

While Not KeyHit(KEY_ESCAPE)
Cls
DrawRect 10, 10, 20, 20
Flip 0

Wend
End
Zieht einen Kern @ 100% . Schlecht
Vollbild: 4403FPS ebenfalls max CPU

Einfach flip 1
BlitzMax: [AUSKLAPPEN]
Graphics 400, 300, 0, 0

While Not KeyHit(KEY_ESCAPE)
Cls
DrawRect 10, 10, 20, 20
Flip 1

Wend
End
Zieht durch warten einen Kern @ 98% . Schlecht Smile
Vollbild: Haut die graka nichtmehr hoch, da nurnoch 60FPS. CPU immernoch 98%

BlitzMax: [AUSKLAPPEN]
Graphics 400, 300, 0, 0
Timer = CreateTimer(30)
While Not KeyHit(KEY_ESCAPE)
Cls
DrawRect 10, 10, 20, 20

WaitTimer timer
Flip 0

Wend
End
Macht knapp 2% Last, scheint also bisschen schlechter als per Graphics aber noch gut.
Vollbild: 30FPS, 2% CPU

Alle getestet im Fenstermodus mit deaktiviertem Debugger.

Da im Vollbild die Hertz Angabe bei Graphics nicht funktioniert, sollte man wohl tatsächlich WaitTimer verwenden, zumindest wenn die Anwendung (auch) für vollbild gedacht ist.


mfg,
Count-Doku

Edit: Vollbildwerte hinzugefügt. FPS nach EVGA Precision X Overlay
Vollbild: Graphics 1920,1080,32,X

kog

BeitragDo, Nov 01, 2012 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm das Problem ist aber, wenn ich Flip 0 mit einem Timer verwende, stockt das Programm jede Sekunde kurz :/ bzw. jede halb sekunde ?
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

count-doku

BeitragDo, Nov 01, 2012 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist komisch.
Habe es gerade mal mit folgendem Testcode probiert, da stockt nichts.

BlitzBasic: [AUSKLAPPEN]
Graphics 400, 300, 0, 0
Local timer:TTimer = CreateTimer(60)
Local x:Float
While Not (KeyHit(KEY_ESCAPE) Or AppTerminate())
Cls

DrawOval Sin(x) * 80 + 200, Cos(x) * 75 + 150, 5, 5
x:+1

WaitTimer timer
Flip 0
Wend
End
Bei dir?



Wie sieht denn dein Code aus?


mfg,
Count-Doku

kog

BeitragDo, Nov 01, 2012 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
timer=CreateTimer(60)

Function Run()
Repeat
Update()
Cls()
Draw()
Flip(0)
WaitTimer(timer)
'Delay 1
If KeyHit(KEY_LCONTROL) ScreenShot()
Forever
End Function


So und beim durch die Welt scrollen so:
Code: [AUSKLAPPEN]
            TEngine.Scrollx2:+(KeyDown(KEY_D)-KeyDown(KEY_A))*(6)
            TEngine.Scrolly2:+(KeyDown(KEY_S)-KeyDown(KEY_W))*(6)



Mit dem Wattimer() stockt es jede halbe sekunde Kurz.
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel
 

PhillipK

BeitragDo, Nov 01, 2012 13:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du testweise mal einen extrem hohen wert für CreateTimer() verwendet?
Ich habe so ein problem noch nie bemerkt. Selbst mit 20 Hertz lassen sich damit relativ flüssig spiele gestalten - sofern man ein paar grundregeln beachtet Smile

Allerdings ist das eher feintuning und ein höherer CreateTimer() wert reicht vollkommen, wenn man nichts wirklich großes geplant hat.

Der wert, den du bei CreateTimer() eintippst, ist klar oder? Ebenso die funktion von WaitTimer() ?
Der wert bezieht sich auf Ticks pro Sekunde. 60 Ticks pro sekunde entspricht also einem tick alle 1/60 sekunde -> 60 FPS.
WaitTimer wartet eben immer auf einen neuen tick, was den flüssigen, gleichmäßigen programmablauf gewährleistet.

Ich kann mir beim besten willen nicht vorstellen, warum es laggen sollte. Hier sind eventuell ein paar hintergrundinformationen zu deinem PC und sonstigem code nützlich - eventuell liegt es am drumrum, was mit dem Timer bei dir entstanden sind? Versuch doch mal einen testcode von count-doku, die sind so ziemlich die grundstruktur die du brauchst =)
Alternativ teste es mit einem Timer der 1000x die sekunde tickt (Das maximum, was timer ermöglichen, meinen tests nach)

kog

BeitragDo, Nov 01, 2012 13:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja der Testcode funktioniert schon, jedoch bei meiner Anwendung kommt es zum Stocken.


http://www.kognetwork.ch/Underground/Client.rar

Mit WASD könnt ihr über die Map scrollen. Bei mir Stockt es :/


*Falscher Link*
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel
  • Zuletzt bearbeitet von kog am Do, Nov 01, 2012 13:40, insgesamt einmal bearbeitet

count-doku

BeitragDo, Nov 01, 2012 13:39
Antworten mit Zitat
Benutzer-Profile anzeigen
dein Link gibtn 404 ...

Aber in deinem Beispiel hast du
BlitzMax: [AUSKLAPPEN]
'...
Cls()
Draw()
Flip(0)
WaitTimer(timer)
'...


Schonmal probiert den Timer vors Flip 0 zu setzen?
Also:
BlitzMax: [AUSKLAPPEN]
timer=CreateTimer(60)

Function Run()
Repeat
Update()
Cls()
Draw()
WaitTimer(timer)
Flip(0)
'Delay 1
If KeyHit(KEY_LCONTROL) ScreenShot()
Forever
End Function
Keine Ahnung obs daran liegen kann, wäre aber ein unterschied zwischen unseren Codes.

mfg,
count-doku

BladeRunner

Moderator

BeitragDo, Nov 01, 2012 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich tippe drauf dass der sonstige Code schon soviel zeit verschlingt dass ein Tick übersprungen wird.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

kog

BeitragDo, Nov 01, 2012 16:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm nunja, mit Flip 1 oder 0 habe ich keinerlei Probleme bezüglich dem Stocken?
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

DAK

BeitragDo, Nov 01, 2012 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Was ich denke, was am Besten ist, ist folgendes:
Haben wir eine (Bildschirm-)Bildwiederholrate von 60, dann sollte Flip 1 ja 60 FPS rauswerfen. Ist hald unökonomisch.
Haben wir Flip 0 mit Timer, dann kriegen wir zeitweise Grafikfehler, wenn der Flip und Bildwiederholung nicht synchron laufen.
Am geschicktesten sollte dann eine Kombination der Beiden: Flip 1 mit einem Timer auf 61 FPS. Dadurch hält der Timer das Programm den Großteil der Wartezeit zwischen den Frames auf (=Ressourcenschonend) und der Flip 1 hält es dann noch die letzten 0.27 Millisekunden im teuren Flip 1, ist dann aber genau synchronisiert mit dem Bildschirmwechsel -> komplett flackerfrei. Was haltet ihr von der Methode? Insgesamt verliert man dann rund 16 Millisekunden pro Sekunde darin, gibt eine zusätzliche Prozessorbelastung von rund 1.6%, was so gut wie gar nichts ist, vorallem weil es sich nicht auf das Spiel bezieht, sondern nur auf die Rechenzeit, die die Mainloop übrig lässt.
Gewinner der 6. und der 68. BlitzCodeCompo

kog

BeitragDo, Nov 01, 2012 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Das klingt gut, jedenfalls hab ich so keine Stocker! Very Happy
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

Jolinah

BeitragDo, Nov 01, 2012 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hattest du bei Graphics die Hertz auf 0? Ich kann mich nur daran erinnern dass es bei mir auch mal stockte trotz Flip 0. Ich fand heraus dass wenn ich bei Graphics die Hertz auf 0 setzte, dass es dann nicht mehr stockte. Irgendwie seltsam, da das ja nur bei Flip -1 Auswirkungen haben sollte.

Ebenfalls merkwürdig finde ich, dass bei meinem PC ein Flip 1 in BMax nie die CPU-Auslastung extrem in die Höhe getrieben hat, so als ob es beim Flip 1 auch in den Wartezustand ginge. Hatte gerade mal 6% Auslastung (Quad-Core, 8 virtuelle CPUs). Mit Flip 0 und Timer ist allerdings auch da das Ergebnis besser (0% im TaskManager).

kog

BeitragDo, Nov 01, 2012 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop, ich nutze 0 Hertz bei Graphics, Flip 0 und Timer = Stocken


Jetzt mit Flip 1 und Timer 61 stockt es nicht.
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

Jolinah

BeitragDo, Nov 01, 2012 21:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah ok. Ja der Ansatz mit Flip 1 und Timer ist schon nicht schlecht. Und so lang's funktioniert Very Happy

Nova

BeitragFr, Nov 02, 2012 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Sagen wir mal so: Gibt es eine Möglichkeit, Flip 0 so zu benutzen, dass man keine Bildfehler (tearing) bekommt? Mich persönlich stört das ganze nämlich tierisch, da ist mir auch die Prozessorauslastung egal...
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group