unterschedliche zeiten bei bildausgabe

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

fliesenklaus

Betreff: unterschedliche zeiten bei bildausgabe

BeitragSo, Nov 09, 2008 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo erstmal
mir ist bei verschiedenen zeitmessungen aufgefallen,das bilder ab einer bestimten anzahl
sprunghaft langsamer dargestellt werden.
auf meinen rechner ist das so:
image oder drawblock bis 39 = 0- 1 ms
ab 40 = 16-18 ms bleibt dann stabil bis ca 500 dann 36 ms
recs bis 20 = 0 - 1 ms dann 16-18 ms erst bei 1500 36 ms

baue ich mehre schleifen unter der 40 aber insgesamt mehr als 1000 steigt der wert nur
langsam ,wie ich es eigentlich sowieso erwartet habe

diese 18 ms tauchen oft auf ,auch in 3d , ich kann 50 würfel
texturieren und anzeigen in nur 1 ms aber 1 sprite ,grösse egal, braucht 18 ms
50 cube 3 sichtflächen mal 2 triangel = 300 dreiecke : sprite 2 ??????

da ich es jetzt weiss ,unterteile ich es eben, aber es wär mir schon recht,warum

dann hätt ich noch ne frage zu meiner grafikkarte ati radeon 9600 se 128 mb agp
mit dem rechner amd 3200+ bin ich sehr zufrieden,was schleifen und mathe angeht
aber könnte ich mit einer der letzten agp karten noch was rausholen ?
wenn meine karte schneller als mein rechner ist ,würde sich eine neue ja nicht lohnen

wegen den bildern habe ich einen kleinen code zum schnellen testen
die 2 werte ,recza + bildza, sind die letzte 1 ms auf meinem rechner
wenn es keine mühe macht , möchte ich gern mal werte erfahren für je 1000 bilder
auf neuen rechner + karten , insbesondere dualcore
ich hab vor 2 jahren einen dual 2200 mhz gekauft ,musste ihn zurückgeben weil nur kaputt,
hab noch auf turbopascal geschrieben und der alte 3200 war um längen schneller
vermute,weil nur ein kern auf 2200 läuft . das wäre dann bei blitz dasselbe, oder ?

Code: [AUSKLAPPEN]

  Graphics 1280,1024,32,1  ; in 3d dasselbe
SetBuffer BackBuffer()
 bild = CreateImage (100,30)   
 Global zeit1

bildza =  39
recza  = 20

.start
Cls

zeit1 = MilliSecs ()
For s1 = 1 To bildza  DrawBlock (bild,200,200) : Next
zeitaus (100,210)

zeit1 = MilliSecs ()
For s1 = 1 To recza  Rect  (200,300,100,30) : Next
 zeitaus (100,310)

   Flip (1)  : If  KeyHit (1) Then End
Goto start
End
;--------------------------
Function zeitaus (x,y)
zeit = MilliSecs()-zeit1 : Text (x,y, zeit)
 End Function

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Nov 09, 2008 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar, du hast ''Flip 1'' eingestellt. Das bedeutet, dass der Rechner versucht stetts mit dem Bildschirm zu syncronisieren. Wenn nun der Rechner mit immer mehr sachen belastet wird und die Bildaufbaufrequenz erreicht wird, geht es gleich zum nächst tieferen Schritt runter. In deinem Fall dann auf jedes zweite Frame welches 36ms später ist. Somit lässt sich auch ausrechnen, dass dein Bildschirm mit etwa 60 FPS läuft, vermutlich ein Flachbildschirm. Bin ganz schön schlau nicht Wink

Der Trick in nun folgender: Da ''Flip 1'' auch leider immer 100% Prozessorauslastung verpulvert. Selbst dann, wenn nichts gezeichnet wird, sollte man immer ein Timer benutzen und das Programm mit ''Flip 0'' laufen lassen. Schaft es nun der Rechner nicht mehr die volle FPS zu berechnen, so bricht es zumindest nicht komplett auf die nächst drunter liegenden Stufe ab, sondern nur so weit, wie es der Rechner schafft. Auch werden keine 100% Prozessorauslastung verpulvert, wenn nicht berechnet wird.

Ein Grundkonstrukt kann dann in etwa so aussehen:

Code: [AUSKLAPPEN]
Graphics 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(60)

While Not KeyHit(1)
   
   WaitTimer(Timer)
   Flip 0
   Cls
Wend
End


Um weiteres Einbrechen einzubeziehen, sollte man das ganze Frameunabhängig programmierern. Dazu mal die Boardsuche anschmeissen.

Edit1: Igit, bähhh, ich sehe gerade deine Gotoverschachtelung. Bitte, bitte, schaue dir mal vernünftige Schleifenmodelle an.

Zum Beispiel: While/Wend oder Repat/Until/Forever dazu noch Exit
 

fliesenklaus

BeitragMo, Nov 10, 2008 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für antwort

allererstmal tschuldigung fürs goto ,benutze ich aber nur in der hauptschleife.
eine altlast vom c64 . und bei assembler

flip (1) muss ich , weil meine grafikkarte sonst nach 3-4 minuten aussteigt.
sie hat keinen eigenen lüfter . ist alt und wird heiss. deswegen der anhang wegen der karte.
ich will unbedingt eine neue.
bei flip 1 kann ich unbegrenzt lange.

aber eins will mir noch nich in kopp.
wenn 39 bilder ja nur 1ms dauert ist es ja noch unendlich weit hin bis zum halbieren
hab mal kurz mit flip 0 versucht und tatsächlich 500 bilder bei 15-16 ms
nur das der wert jetzt langsam steigt
also müsste doch erst bei 500 der zauber losgehen und nich schon bei 40

verzeihe meine skepsis

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Nov 10, 2008 3:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal, wenn ''Flip 0'' bei dir die Grafikkarte sprengt, dann solltest du auch ein Timer benutzen. So wie ich es oben beschrieben habe. Denn was macht ''Flip 1'' ? Es wartet so lange, bis der Kathodenstrahl des Monitors unten angekommen ist und wechselt dann erst den Frontbuffer mit dem Backbuffer, damit keine sichtbaren Verzerrungen bei horizontaler Bewegung sichtbar wird. Bei Flachbildschirmen gibt es keinen Kathodenstrahl, aber das Signal wird denoch an das System gesendet, da auch ein Flachbildschirm nur eine begrenzte Datenmenge verarbeiten kann. Und diese liegt bei Flachbildschirmen deutlich niedriger bei meistens etwa 60 FPS. Machst du nun ''Flip 0'', dann wird nicht gewartet und das System berechnet was das Zeug hält. In deinem Fall bis zum Systemcrash, weil deine Grafikkarte wohl etwas fehlerhaft zu sein scheint. Aus diesem Grund wird ein Timer benötigt, welcher das System dann auf eine von dir festgelegte Taktfrequenz limitiert. Von mir aus auch auf 60 FPS. Also Timer=CreateTimer(60)... Willst du deinem System auch nahe dessen Grenzen etwas Zeit gewähren, so kombiniere das ganze noch mit ein kleinem ''Delay 4'' zum Beispiel. Das würde bedeuten, dass das System eher an die 60 FPS Grenze kommt und schneller einbricht, dafür aber immer noch etwas ''Luft'' für das System übrig bleibt.

Auerdem hast du unter Blitz3D zwangsweise immer eine Prozessorkernauslastung von nahe 100%, wenn man ''Flip 1'' nutzt. Auch das habe ich oben beschrieben. Das ist leider ein Problem von Blitz so weit ich es beurteilen kann. Die Vollauslastung kommt immer, auch dann wenn garnichts nennenswertes angezeigt wird.

Und nochmal zum Grundproblem, warum sich deine FPS auf einem Schlag auf 18ms und dann auf 36ms herabsetzen. Wenn du ''Flip 1'' benutzt, wird eben auf dem Bildaufbau gewartet. Wenn nun dein Rechner keine vollen 60FPS schafft, dann wird das Signal ''übersehen'' und zwangsweise auf das nächste gewartet. So wird dann schnell aus 60FPS eben 30FPS. Stelle dir das so vor, als wartest du auf einen Zug. Verpasst du diesen nun um nur einer Sekunde, dann mußt du gleich auf den nächsten warten. So kann eine Sekunde Verspätung gleich 5min oder sonst was bedeuten. Auch aus diesem Grund ist es besser, man nimmt ''Flip 0'' mit einem Timer zusammen, denn dieser ist zwar ein Taktgeber. Aber nur in dem Sinne, wenn das System es auch rechtzeitig schafft. Schafft es das nicht, wird sofort weiter gemacht. Aber hier dann auch gleich wieder dein Problem mit deiner fehlerhaften Grafikkarte, wo du dann eben noch ein Delay benutzen mußt.

Eine Grundstruktur könnte dann so aussehen:

Code: [AUSKLAPPEN]
Graphics 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(60)

While Not KeyHit(1)
   
   ; HIER KOMMT DEIN ZEUG
   
   WaitTimer(Timer)
   Delay 4
   Flip 0
   Cls
Wend
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

fliesenklaus

BeitragMo, Nov 10, 2008 7:52
Antworten mit Zitat
Benutzer-Profile anzeigen
danke ,das ist jetzt wirklich angekommen. hab ja nur gutes tun wollen für die karte.(schluchz)

das mit den abstürzen ist schlagartig gekommen. erst bei einen spiel,ne woche später noch eins
und jetzt regelmässig. seit ungefähr einen monat. hab dann alle lüfer hochgedreht und das teil
ist jetzt richtig laut. die tage werde ich losmarschieren.
eine Sapphire Radeon HD 3850 512MB AGP soll es werden

kann ich dann wieder auf flip 0 schalten ohne timer oder ist
generell besser bei lcd mit timer
das noch und es ist ruhe ,einfaches ja oder nein reicht

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Nov 10, 2008 14:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Jeder Bildschirm hat eine maximale Darstellungsgeschwindigkeit. Bei Flachbildschirmen liegt sie meistens bei 60 oder 75 Hz. Bei alten CRT ist es sehr unterschiedlich, das fängt das mit 80 Hz an und endete bei einem meines älteren Sony bei vollen 200 Hz. Wegen der Aufbauart ist es für Flachbildschirme aber auch nicht notwendig wesentlich höhere Aufbaufrequenzen zu haben. Und da eh jeder Bildschirm nicht mehr anzeigen kann, als seine Grenzen sind, sollte immer ein Timer mitgeschaltet werden.

Stelle dir nun vor, dein Programm läuft mit 1000 FPS... Welchen Sinn soll es denn dann haben, wenn kein Bildschirm es je darstellen kann. Bei jedem Bild, was der Bildschirm anzeigt, muß dann der Rechner 10 Bilder berechnen, die jeweils zu nichtmal 1/10 angezeigt werden. Es ist also gerade bei ''Flip 0'' sehr wichtig einen Timer einzustellen. Ansonsten würde dein Programm auf jedem Rechner volle Prozessorauslastung verursachen. Das bedeutet: Hocher Lüfterlärm (auch bei einem einfachen Pongklon und somit zu Mismut der User), Hohe Energieverschwendung (wegen einer Prozessor-Vollauslastung), Und sogar bis zum Fehlverhalten des Rechners, weil keine anderen Dinge mehr vernünftig erledigt werden können (zum Beispiel CD-Brennen ohne Proof-Technik).

Die von mir gezeigte Grundstruktur ist in dem Sinne schon richtig. Es gibt allerdings auch andere Ansätze, wo sich einige User einen Timer selbst basteln. Ob die andere Methoden besser sind, sei erstmal dahingestellt. Falls dich das wirklich interessiert, sollte die Boardsuche da weiter helfen.

Außerdem auch von Interesse könnte folgender Link sein: https://www.blitzforum.de/foru...hlight=100
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

fliesenklaus

BeitragMo, Nov 10, 2008 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
danke hectic

ich habe das jetzt alles geändert und den timer eingebaut .
erst mal 60 ,aber jede sekunde einen kleinen aussetzer,dann langsam hoch bis das ruckeln weg war
und nochmal 10 drauf.
liege jetzt bei 78 .
was soll ich sagen. die karte bleibt kalt,hab meine lüfter alle wieder runtergedreht,schön leise
und meine millisecs zeigen pro durchlauf gerade mal 4ms an .
baue gerade ein 3d animator .hat schon 54 buttons und hat sonst eben immer 18 ms angezeigt

deine hilfe war echt grosse klasse


kann geschlossen werden

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Nov 11, 2008 0:36
Antworten mit Zitat
Benutzer-Profile anzeigen
fliesenklaus hat Folgendes geschrieben:
...aber jede sekunde einen kleinen aussetzer...

Das lässt sich ohne weiteres nicht so einfach beheben. Da das Programm sich nun nicht mehr nach dem Bildschirm syncronisiert, kommt es zwangsweise zu geringem asyncronem Verhalten. Bei dir eben einmal in der Sekunde. Auf anderen Bildschirmen dann eventuell auch anders. Es lässt sich aber unter Blitz aber auch bei anderen Programmiersprachen anscheinend nicht anders lösen ohne gleich den Rechner lahm zu legen. Aber sei beruhigt, id-software hat mit Doom 3 - soweit mir bekannt - erstmals ein komerzielles Spiel auf 60 FPS gedrosselt festgelegt u.a. auch um genau die ganzen Probleme im vornerein zu unterbinden.

Freud mich, dass es nun funktioniert.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group