flip 0 ohne flimmern

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

bjh

Betreff: flip 0 ohne flimmern

BeitragMo, Apr 25, 2011 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo

gibt es eine möglichkeit das flimmern im vollbildmodus vollkommen zu beseitigen?
bei mir flimmert es nämlich immer ein bisschen.

hilft vielleicht cls ein bisschen dabei?
ich hab schon viel rumprobiert und gesucht, aber es flimmert immer.

vielleicht muss ich waittimer und flip 0 anders anordnen.

ich hoffe jemand kann mir helfen Very Happy

darth

BeitragMo, Apr 25, 2011 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

SetBuffer und BackBuffer solltest du dir mal anschauen. Das sollte Flimmern eigentlich verhindern.
Ansonsten solltest du bei der Reihenfolge von Flip, Cls und WaitTimer aufpassen, weil es sonst auch zum Flimmern kommen kann.

MfG,
Darth
Diese Signatur ist leer.

Dottakopf

BeitragMo, Apr 25, 2011 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
wird wohl am warscheinlichsten daran liegen, dass du keinen Timer hast und dein Ultra Quadcore prozessor grad 1000 FPS für ein Hello World verballert. Rolling Eyes

(Also vermute ich jetzt mal )

Siehe dazu Waittimer.


Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

bjh

BeitragMo, Apr 25, 2011 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Very Happy

alles nein! Wink

meine codes sehen immer so aus:

Code: [AUSKLAPPEN]
timer=createtimer(60)
graphics3d 1600,1200,32,1
setbuffer backbuffer()

while not keyhit(1)

     renderworld

     flip
     waittimer timer
wend
end


aber wenn es so aussieht flimmert es ein bisschen:

Code: [AUSKLAPPEN]
timer=createtimer(60)
graphics3d 1600,1200,32,1
setbuffer backbuffer()

while not keyhit(1)

     renderworld

     flip 0
     waittimer timer
wend
end


so noobig bin ich auch nicht mehr Cool Very Happy Wink

Xeres

Moderator

BeitragMo, Apr 25, 2011 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach Vsync optional und setzte es standardmäßig auf 0 - dann darf jeder selbst entscheiden, ob er seine CPU aus lastet oder nicht.
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)
 

bjh

BeitragMo, Apr 25, 2011 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
funktioniert das auf anderen rechnern ohne flimmern?
wenn bestimmte dinge nur in einem frame angezeigt werden, dann soll das nicht irgendwie verloren gehen.
naja

BtbN

BeitragMo, Apr 25, 2011 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist es nicht eher so, dass mit deaktiviertem vsync die GraKa/CPU 100% ausgelastet wird, weil die GraKa einfach vollgas gibt?

Xeres

Moderator

BeitragMo, Apr 25, 2011 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei deaktiviertem vsync (flip(0)) werde so viele Frames berechnet wie geht, darum muss man dass mit einem Timer begrenzen.
Bei aktiviertem vsync (flip(1)) wird immer gewartet, dass der Buffer fertig gezeichnet wurde, so wird Flimmern verhindert aber gleichzeitig belastet BB die CPU zu 100% (weshalb erstere Variante klar zu bevorzugen ist).
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)

BtbN

BeitragMo, Apr 25, 2011 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ein fehler in BB, der seit ewigkeiten nicht gefixt wird?

Lakorta

BeitragDi, Apr 26, 2011 0:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Gehört das "Waittimer timer" nicht vor "Flip 0"?

Code: [AUSKLAPPEN]

timer=createtimer(60)
graphics3d 1600,1200,32,1
setbuffer backbuffer()

while not keyhit(1)

     renderworld

     waittimer timer  ;<--- So
     flip 0
wend
end
---

Mr.Keks

BeitragDi, Apr 26, 2011 0:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso sollte das ein Fehler in Blitz sein? Wenn vsync drin ist, synchronisiert sich Blitz eben am Flip mit dem Bildaufbau des Bildschirms. Blitz wartet dann, bis das vorige Frame vollständig übertragen wurde. Das verhindert Tearing, nicht Flimmern! (Wenn vsync-0 flimmert, liegt das wohl eher an nem Bug in B3d/Grakatreiber/Bildschirm). Mit WaitTimer wird Tearing nicht wirklich garantiert ausgeschlossen, besonders wenn es erst nach dem Flip steht.
Kann man drüber streiten, ob dafür 100% CPU-Last benötigt werden. Allerdings gibt es auch irgendwie keinen dringenden Grund, den Spiel-Thread da immer für die paar Millisekunden runterzufahren. Spiele lasten die CPU ziemlich standardmäßig zu 100% aus. (Und zumindest meine Spiele haben eh immer FPS weit unter der Bildwiederholrate das Monitors xD)
MrKeks.net

BtbN

BeitragDi, Apr 26, 2011 0:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil BB offensichtlich mit aktivem warten auf den vsync wartet, anstatt in dieser zeit ans system zurückzugeben und auf den passenden interrupt zu warten, wie es so zimlich alle andern Spiele tun. Hab schon ewig kein Spiel mehr gesehen, was mir auch nur einen Kern permanent auf 100% getrieben hat.

Mr.Keks

BeitragDi, Apr 26, 2011 1:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich gehe eigentlich davon aus, dass Flip ziemlich genau auf das Flip von DirectDraw aus DirectX7 abbildet und dessen Flags DDFLIP_WAIT bzw DDFLIP_NOVSYNC oder so nutzt. Das Busywaiting kommt dann von dem und nicht aus Blitz.
MrKeks.net
 

bjh

BeitragDi, Apr 26, 2011 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
ich glaub ich nehm jetzt flip 0 und bau ein bisschen blur ein, damit das "ruckeln" ganz übereckt wird.

kann ich irgendetwas bei der grafikkarte umstellen, damit das besser läuft?

BtbN

BeitragDi, Apr 26, 2011 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax hat das Problem im D3D7 modus nicht.
Kurzer blick in die quellen des D3D7 Moduls zeigt, dass dort je nach Modus 2 verschiedene dinge passieren.
Im Vollbild wird einfach nur die Flip-Methode des IDirectDrawSurface7 aufgerufen. Je nach aktiviertem vsync oder nicht ohne oder mit DDFLIP_NOVSYNC.
Im Fenstermodus wird, sofern vsync aktiviert, vor dem flipping die WaitForVerticalBlank methode von DirectDraw7 aufgerufen.

Ein einfaches D3D7 Test Programm mit aktivem VSync was ausser FPS messen nix tut läuft hier im vollbild und im fenstermodus sauber mit 60FPS und 0% CPU auslastung.

Fazit daraus ist, dass es sich bei BB klar um einen implementierungs-fehler handelt, der recht einfach gefixt werden könne. Vermutlich wartet BB wirklich aktiv auf den vsync, sämmtliche DirectDraw befehle(Die man auch bei Direct3D7 nutzen muss) tun dies auf jeden fall nicht.

Pummelie

BeitragDi, Apr 26, 2011 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Flimmert es jetzt immernoch?
BlitzBasic: [AUSKLAPPEN]
timer=CreateTimer(60)
Graphics3D 1600,1200,32,1
SetBuffer BackBuffer()
Local flip_timer
While Not KeyHit(1)

RenderWorld
If flip_timer<MilliSecs() Then
Flip(0)
flip_timer=(MilliSecs()+18)
EndIf

WaitTimer timer
Wend
End
It's done when it's done.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group