Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

FB berechnet ungleichmäßig....

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 21.04.2006, 19:07    Titel: FB berechnet ungleichmäßig.... Antworten mit Zitat

Hallo, ich hab diesen Code zum Test geschrieben...

Code:
screen 14,8,8,0
Dim Sprite as ubyte ptr
Sprite=imagecreate(20,20)
paint(0,0),1
get (0,0)-(19,19),Sprite
cls
Start#=Timer
Temp#=timer
Dim SleepAdder as double
SleepAdder=0
do
    if Timer > Temp# + 0.03 +(SleepAdder/1000) then
        for K= 1 to 5000
            put (300*rnd,220*rnd),Sprite
        next
        FPS+=1
        Temp#=Timer
    end if
    if Timer >= Start# + 0.5 then
        locate 1
        print "FPhS:";FPS,"SleepAdder:";SleepAdder;"   "
        if FPS < 15 then SleepAdder -= 1
        if FPS > 15 then SleepAdder += 1
        FPS=0
        Start#=Timer
    end if
    sleep 1
loop until len(inkey)


wenn ich ihn ausführe und gleichzeitig winamp laufen lasse, bleibt er konstant bei 15....16 Frames pro halbe sekunde (halbe sekune, damit der "SleepAdder" auch schön adjustieren kann...)

wenn winamp aber aus ist, sind die werte so ungefähr: 15-14-17-11-15-11... Dadurch wird der bildschirmaufbau sehr instabil.... woran liegt's, bzw kann's liegen?
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 21.04.2006, 19:52    Titel: Antworten mit Zitat

Windows Media Player stat WinAmp:
Bei mir ist es anders rum:
Wenn der Media Player lauft spinnt bei mir die Regelung.

Code:
Dim SleepAdder as double

Wieso Double?! Du machst ja nur +-1.

Besser wird es, wenn ich das SLEEP 1 raus nehme.

peinlich
Code:
screen 14,8,8,0
Dim Sprite as ubyte ptr
Sprite=imagecreate(20,20)
paint(0,0),1
get (0,0)-(19,19),Sprite
cls
Start#=Timer
Temp#=timer
Dim SleepAdder as double
SleepAdder=0
do
    if Timer > Temp# + 0.03 +(SleepAdder/1000) then
        Temp#=Timer
        for K= 1 to 5000
            put (300*rnd,220*rnd),Sprite
        next
        FPS+=1
    end if
    if Timer >= Start# + 0.5 then
        Start#=Timer
        locate 1
        print "FPhS:";FPS,"SleepAdder:";SleepAdder;"   "
        if FPS < 15 then SleepAdder -= 1
        if FPS > 15 then SleepAdder += 1
        FPS=0
    end if
    sleep 1
loop until len(inkey)

Noch fragen?
Deine Put Aktion hat die Streuung zu verantworten ...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 21.04.2006, 21:30    Titel: Antworten mit Zitat

double das war,weil ichs erst mit kommazahlen geregelt hab lächeln

in jedem fall sollte, da immer die selbe aktion ausgfeführt wird, auch imemr ungefähr die selbe rate rasukommen?
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 22.04.2006, 10:28    Titel: Antworten mit Zitat

Code:
        for K= 1 to 5000
            put (300*rnd,220*rnd),Sprite
        next

Das ist ja eine Ziemlich Aufwendige Aktion und wenn dein Rechner nicht gleichmässig belastet ist, braucht es eben untersichtlich lange.
Ein 3D Spiel hat jenach Situtation auch nicht gleichviele FPS.

Und wenn du im Hintergrund Videos umwandelst, braucht Firefox auch länger zum starten.

Wenn es an Rechenzeit mangelt oder wenn es "zuviel" davon gibt, dann braucht eben alles Unterschiedlich lange.

Zitat:
wenn winamp aber aus ist, sind die werte so ungefähr: 15-14-17-11-15-11... Dadurch wird der bildschirmaufbau sehr instabil.... woran liegt's, bzw kann's liegen?

Läuft im Hintergrund Internet, ICQ, Windows Messenger, Firewall, Anti Virus Programm ...
Diese Programme bekommen "zufällig" Datenpakte rein und belasten halt kurz die CPU. Die CPU ist dann halt kurz zeitig mit anderen Dingen beschäftigt als mit deinem Programm und muss ihm drum Rechenzeit abnehmen.
(Bevorzugt bei der PUT Aktion, weil die am meisten Rechenzeit braucht)
Übrigens ist genau dein Programm ein Beispiel für kurz zeittige Belastung, die dauernt ändert.
Jede Millisekunde läuft dein Programm kurz an und prüft die Zeit, alle 0.03 Sekunden braucht dein Programm viel mehr Rechenzeit um dann wieder nichts zutun.
Und dann alle 0.5 Sekunden machst du noch irgendeine Ausgabe.
Wenn jedes Programm im Hintergrund sich so verhält, sind die Schwankungen kein Wunder.
Wieso es dann mit Winamp nicht mehr passiert?
Wahrschneilich bügelt Winamp die ungleichmässige "Leerlauf belastung" durch seine grössere, gleichmässige Belastung aus.

Zitat:
FB berechnet ungleichmäßig....

Ist meiner Meinung nach eine Falsche Aussage, wenn man die Zeit am falschen Punkt misst, schwanken die FPS halt (übrigens verfälscht allein schon die Messung das Resultat und die Messung in deinem Code sich sogar noch selbst).
Zudem würde der gleiche Code in C, C++, Java etc. genau so tun.

Hast du meinen Code ausprobiert?
Wenn man die Zeitmessung an einen anderen Ort setz, wird die Frame rate ja schon viel Stabiler.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 22.04.2006, 22:42    Titel: Antworten mit Zitat

ich hab an dem rechenr kein inet, also weder icq noch virenprogramme oder sonstiges zeugs.... unter winXP laufen grad mal 20 prozesse, wenn fb nicht gestartet ist....

edit: ich wioll ja damit auch gar ent sagen, dass mir fb zu ungenau ist.

ich will nur sagen, des wegen diesen +/- 1 millisekudnen (überleg mal wie wenig das ist!!!) plätzlich die framerate so instabil wird!
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 23.04.2006, 08:09    Titel: Antworten mit Zitat

+/- 1 Millisekunde ist bei 30 FPS schon viel, pro Frame hast du na nur 33.33ms Zeit zum Berechen.

Nur 20 Prozesse lachen.
Wenn jeder zwischen durch etwas berechnen will, streut das halt fehler ein.
(WinXP ist von daher eine geniale Architektur)

Ob man mit dieser Abweichung von +/- 1 FPS leben kann, must du wissen.
Übrigens gilt in der Digitalen Messtechnik allgemein ein Messfehler von +/-1 Digit (eine Anzeige Einheit, hier eben +/- 1 FPS), von dem her liegst du sogar in der Toleranz der Messung.

Übrigens kann die +/- Millisekunden schwanken vom Code selbst kommen.
Der sleep 1 Befehl gehört zur WinAPI und ist recht ungenau, schon dort streut es Fehler ein, weil Windows die 1 ms als Unverbindlich betrachtet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 23.04.2006, 12:39    Titel: Antworten mit Zitat

Also FB und Sleep vermeide ich immer.

Ich habe nämlich das gefühl, dass da ein FB Bug ist, und meiner Meinung nach gehört Sleep nicht zur WinAPI. Ihr könnt es ja mal testen:

Code:

Declare Sub SleepApi Alias "Sleep" (byval millisec As Integer)

Dim As Double start, ende
Dim As UInteger zaehler=0
#define sec 1

For i = 1 to 5
   start=Timer+sec

   Do
      zaehler+=1
      SleepApi 1
   Loop Until Timer>=start
   Print "SleepApi 1 =";zaehler/(sec*1000);"msec"
   
   start=Timer+1
   zaehler=0
   Do
      zaehler+=1
      Sleep 1
   Loop Until Timer>=start
   Print "Sleep 1 =";zaehler/(sec*1000);"msec"
Next i

Sleep


Da sieht man den Unterschied besser, vor allem, bei den weiteren Aufrufen.
SleepApi hat beim ersten mal auch 0.5 msec, danach immer 1.03 oder so. Sleep hat aber immer 0.54msec, also ungenauer.

Ich hatte auch mal ein Prog mit OGL, da war mit sleep 15 alles gaaanz unterschiedlich, manchmal 100 frames, manchmal 500, und das war sogar nur von der tageszeit abhängig. Morgens ging alles langsamer als Abends. durchgeknallt
Am besten macht man immer ein Sleep 1 und den Rest regelt man mit Timer, dann ist man auf der sichersten seite.

Michael
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 23.04.2006, 15:05    Titel: Antworten mit Zitat

Unbelastet hat Folgendes geschrieben:
SleepApi 1 = 0.1msec
Sleep 1 = 0.1msec
SleepApi 1 = 0.2msec
Sleep 1 = 0.1msec
SleepApi 1 = 0.2msec
Sleep 1 = 0.1msec
SleepApi 1 = 0.2msec
Sleep 1 = 0.1msec
SleepApi 1 = 0.2msec
Sleep 1 = 0.1msec

Musik abspielen hat Folgendes geschrieben:
SleepApi 1 = 0.592msec
Sleep 1 = 0.493msec
SleepApi 1 = 0.96msec
Sleep 1 = 0.467msec
SleepApi 1 = 0.988msec
Sleep 1 = 0.623msec
SleepApi 1 = 1.24msec
Sleep 1 = 0.632msec
SleepApi 1 = 1.262msec
Sleep 1 = 0.593msec

Wow, hätte ich jetzt nicht gedacht, vorrallem das Unbelastet!
Nun ja, Sleep ist halt auch kein Präzisons Befehl, vorrallem Sleep 1 soll ja nur die CPU entlasten.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 23.04.2006, 20:47    Titel: Antworten mit Zitat

Das Thema, dass sleep nicht zur WinAPi gehört hatten wir schonmal (ich hab mir sogar die forenseite auf den rechner gezogen)... wobei das auch schlecht wäre, wenn dem so wäre, weil's dann sicehr schelchter zu portieren wär (freebasic for linux....)
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz