unterschedliche zeiten bei bildausgabe
Übersicht

fliesenklausBetreff: unterschedliche zeiten bei bildausgabe |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() ![]() ![]() ![]() ![]() ![]() |
||
fliesenklaus |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group