Merkwürdiges Flackern

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

ToeB

Betreff: Merkwürdiges Flackern

BeitragMi, März 16, 2011 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe dafür keine Erklärung, immer wenn ich ein Programm mit Blitz3D Kompiliere, und dann ein zweites starte, flackern diese die ganze zeit, und zwar nur wenn ich z.B. Flip benutze. Das Programm sieht dann so aus :
Code: [AUSKLAPPEN]
Graphics 400, 300, 16, 2
SetBuffer BackBuffer( )

Repeat
   Text 0, 0, "Hallo !"+Rand( 999 )
   Flip
   Cls
Until KeyHit( 1 )
End


Einmal gestartet, geht wunderbar, danach noch einmal, flackert. Ich benutze WindowsXP (x32) Professional (2002) - Servicepack 3. Gafiktreiber alle installiert (die neusten) und auch sonst eigl. alles auf dem neusten stand.

Ich hoffe ihr könnt mir helfen Sad

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Eingeproggt

BeitragMi, März 16, 2011 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub wir haben ein neues Argument gefunden, weshalb man keinesfalls auf einen Timer verzichten soll Wink
Ich hab bereits nach deinem Beitrag im anderen Forum (wo es um die Sache mit IDEal - Anwendung 2mal starten ging) das mitn Flackern ausprobiert. Und bei mir (Ebenfalls Win XP 32Bit, SP3) war da nix zu sehen. Jetzt mit deinem Testcode flackert es. Und bau ich n Timer (50Hz) ein, flackerts nimma.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

ToeB

BeitragMi, März 16, 2011 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah ja... war mein Fehler^^ hatte nen Timer drin (bei meinem eigentlichen Code, der andere code hier war das ganze nur schnell hingeschrieben) aber Flip 1 nicht Flip 0 -.-

Danke dir !

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Midimaster

BeitragMi, März 16, 2011 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist der FLIP-Befehl

ohne den Zusatz einer 0 wartet der in einer Schleife auf den VSync. Innerhalb dieser Schleife verbrät er 99% der Systemleistung und läßt anderen Programmen keine Luft mehr zum "atmen". Jeder jetzt nebenher laufende Prozess kommt da ins Stolpern. In dieser Test-Umgebung startest Du kein WORD mehr und selbst der Windows-Tasmanager schafft es kaum hoch.

Startest Du das Programm 2x, dann bringen sie sich gegenseitig zum Stolpern. Aber nicht erst jetzt taucht das Problem auf, Du bemerkst es erst jetzt.

Du kannst die Behinderung aber auch schon daran erkennen, dass der Zähler im Programm in einer Sekunde nur bis 60 hochzählen kann, obwohl er dazu 100% der Leistung braucht.

Ein CreateTimer(60) gibt nun jede 1/60 Sekunde für 59/60 Sekunden an das Betriebssystem ab. Dadurch kommen andere Programm wieder zum Zug. Auch ein parallell gestartetes 2.Programm zählt nun brav bis 60. Allerdings musst Du den Flaschenhals FLIP in FLIP 0 umwandeln, sonst nutzt es nix!

DELAY würde übrigens auch helfen. Hier wäre sogar eine Zählen bis 1000 in einer Sekunde möglich. Und die Systemleistung bleibt trotzdem niedrig!
BlitzBasic: [AUSKLAPPEN]
Graphics 400, 300, 16, 2
SetBuffer BackBuffer( )


Repeat
Text 0, 0, "Hallo !"+Rand( 999 )
Flip 0
Delay 1
Cls
Until KeyHit( 1 )
End

Pummelie

BeitragMi, März 16, 2011 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Das beim warten auf VSync die Leistung nicht mehr an das System freigegeben wird, war vlt. mal vor 10 Jahren so...
Inzwischen gibt es aber die Leistung zurück, und führt keine Repeat;Until-Schleife selbst mehr aus. Normalerweise jedenfalls.

Wenn ein Prog mit Flip 1 100& CPU brauchst, dann ist der PC entweder extrem lahm, oder alt (oder beides^^).
It's done when it's done.

Midimaster

BeitragMi, März 16, 2011 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
@Pummelie:

Kannst Du das beweisen, oder redest Du nur so daher, ohne es ausprobiert zu haben?

Hier mal mein "Beweiscode":

BlitzBasic: [AUSKLAPPEN]
Graphics 400, 300, 16, 2
SetBuffer BackBuffer( )
Oft=1
Repeat
Text 0, 0, "Aber hallo! Jedesmal "+sum/oft +"msec pro Flip!!!"

zeit%=MilliSecs()
Flip
zeit=MilliSecs()-zeit

Sum=Sum+Zeit
Oft=oft+1
Delay 1
Cls
Until KeyHit( 1 )
End
  • Zuletzt bearbeitet von Midimaster am Mi, März 16, 2011 21:12, insgesamt einmal bearbeitet

aMul

Sieger des Minimalist Compo 01/13

BeitragMi, März 16, 2011 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimme Midimaster zu. Kurzer Test zeigt, dass Flip(1) einen meiner vier Kerne zu 100% nutzt.
Wenn ich stattdessen einen timer benutzte bin ich bei 7%(ein richtiges Programm, kein leerer Testcode natürlich). Das wird wohl kaum Zufall sein.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Midimaster

BeitragMi, März 16, 2011 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist auch der Grund, warum Pummelie glaubt, auf seinem Rechner würde nicht auf den VSync gewartet. Die wahrscheinlich vielen) anderen Kerne gaukeln ihm eine "unter 100%"-Auslastung vor.

Der Prozessorkern muss erst noch gebaut werden, der bei FLIP 1 nicht in die Knie geht! Wink Wo wir jetzt doch alle Atom-Energie sparen sollen...

Pummelie

BeitragMi, März 16, 2011 22:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code den du gepostet hast...
user posted image

PS: 120 Herz Monitor
It's done when it's done.

DaysShadow

BeitragMi, März 16, 2011 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Glaubs doch einfach.

Hier nochmal in BlitzMax:

BlitzMax: [AUSKLAPPEN]
SuperStrict

Graphics( 800, 600, 32, 60 )

Repeat

Cls( )

Flip( 1 )

Until( KeyHit( KEY_ESCAPE ) Or AppTerminate( ) )


Im Vollbild habe ich 25% Auslastung, also ist ein Kern auf 100%.
Im Fenstermodus ist es auf 0, liegt aber wohl daran, dass Windows da was regelt, was es im Vollbild nicht tut.
Mein Rechner ist weder langsam noch alt und um einiges schneller als deiner, also was willst du hier erzählen?

Führe das Programm doch mal im Vollbild aus und wechsle auf den Desktop während es weiter läuft und zeig dann mal die Auslastung.
Blessed is the mind too small for doubt

Pummelie

BeitragMi, März 16, 2011 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Vollbild habe ich 0-5%...

Wieviel Leistung hat ein Kern bei dir?
It's done when it's done.

Noobody

BeitragMi, März 16, 2011 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Was ist denn mit dem aggressivem Unterton hier?

Ist es so schwer zu glauben, dass nicht jeder einzelne Rechner auf diesem Planeten gleich auf ein Stück Code reagiert?
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

ZaP

BeitragMi, März 16, 2011 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei ATi Grafiktreibern kann man VSync aus/an erzwingen, vielleicht ist das hier der Fall? Denke bei den Grünlingen geht das auch.
Starfare: Worklog, Website (download)

Midimaster

BeitragDo, März 17, 2011 1:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Pummmelie,

wie ich sehe, stimmtst Du mir nun zu. Danke! Und Du belegst das dann ja auch noch gleich mit dem Screenshot!

bei einem 60Hz Monitor hast du alle 16msec einen VSync, bei einem 120Hz-Monitor alle 8msec.

Das bedeutet, dass eigentlich einer der Kerne auf 100% geht. Vielleicht hast Du einen Rechner, der die Last geschickt auf mehrere Kerne umschichtet. Vielleicht ist aber auch die Grafikkarte in der Lage die VSync-Anfrage zu handle'n?

Aber für die Masse der Rechner (vor allem die der Kunden) gilt:

Fakt ist und bliebt Du verlierst durch jeden FLIP pro Schleife 8 msec. Bei einer Hauptschleife OHNE WaitTimer() summiert sich dieser "Verlust" auf 120x 8msec = 960msec pro Sekunde. Die restl. 40msec stehen dem eigentlichen Programm zur Verfügung. Auf einem Single-Core müssen alle anderen Prozesse sich davon noch irgendwie was abringen.

Bei einer Hauptschleife mit CreateTimer(60) sind immerhin nur 60x8msec=480msec verloren. Nach jedem VSync gehören dann die folgenden 8msec dem Betriebssystem bis dann der TIMER() die Kontrolle an das Programm zurückreicht. Dem bleiben aber auch hier nur 40msec von der ganzen Sekunde übrig.

Die korrekte Arbeitsweise ist die mit FLIP 0 und einem TIMER oder DELAY.

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group