 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 21.04.2006, 19:07 Titel: FB berechnet ungleichmäßig.... |
|
|
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 |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 21.04.2006, 19:52 Titel: |
|
|
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.
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 21.04.2006, 21:30 Titel: |
|
|
double das war,weil ichs erst mit kommazahlen geregelt hab
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 |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 22.04.2006, 10:28 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 22.04.2006, 22:42 Titel: |
|
|
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 |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 23.04.2006, 08:09 Titel: |
|
|
+/- 1 Millisekunde ist bei 30 FPS schon viel, pro Frame hast du na nur 33.33ms Zeit zum Berechen.
Nur 20 Prozesse .
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 |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 23.04.2006, 12:39 Titel: |
|
|
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.
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 |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 23.04.2006, 15:05 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 23.04.2006, 20:47 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|