|
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 |
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 24.01.2016, 20:10 Titel: Grafikgeschwindigkeiten verbessern? |
|
|
Ich stehe vor einem kleinem Problem.
Eine Grafik soll auf dem PC von einem Punkt zum anderen wandern und das in extrem hoher Geschwindigkeit:
Code: | DO
Bpuffer = IMAGECREATE(90,90)
Bbpuffer = IMAGECREATE(90,90)
BLOAD (EXEPATH & "\G1.bmp", Bpuffer)
BLOAD (EXEPATH & "\G2.bmp", Bbpuffer)
SCREENLOCK
PUT (oldx, oldy), Bpuffer, TRANS
PUT (x, y), Bbpuffer, TRANS
SCREENUNLOCK
IMAGEDESTROY (Bbpuffer)
IMAGEDESTROY (Bpuffer)
IF MULTIKEY(&h01) THEN END
LOOP |
Leider ist die Geschwindigkeit nicht sehr hoch! Was kann man dagegen tun? Gbt es da möglichkeiten, die Geschwindigkeit zu verbessern? Es soll eigentlich ein Ball oder eine Kugel sein, die über den Bildschirm rollt.
Selbst mit Circle ist die Geschwindigkeit nicht das was ich will.
Code: | CIRCLE(oldx, oldy), 5, &h000000,,,, F
CIRCLE(x, y), 5, &hFFFF00,,,, F |
Wäre dankbar für eine fundierte Lösung! Mir fällt nämlich momentan nichts gutes ein.
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 24.01.2016, 20:55 Titel: |
|
|
Warum lädst du die Grafik in jedem Durchgang der Schleife neu? Schon mal dran gedacht, dass das ständige Neuladen und erstellen / löschen der Bildpuffer nicht sehr performant ist? _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 24.01.2016, 21:03 Titel: |
|
|
Wie jojo schreibt, setzt dieses mal vor der Do/Loop :
Code: | Bpuffer = IMAGECREATE(90,90)
Bbpuffer = IMAGECREATE(90,90)
BLOAD (EXEPATH & "\G1.bmp", Bpuffer)
BLOAD (EXEPATH & "\G2.bmp", Bbpuffer) |
Gruss |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 24.01.2016, 21:22 Titel: |
|
|
Zitat: | Wie jojo schreibt, setzt dieses mal vor der Do/Loop :
Bpuffer = IMAGECREATE(90,90)
Bbpuffer = IMAGECREATE(90,90)
BLOAD (EXEPATH & "\G1.bmp", Bpuffer)
BLOAD (EXEPATH & "\G2.bmp", Bbpuffer) |
Im Originalquellcode ist das eh vorm Do/Loop. Ich habe das Do/Loop nachträglich hier eingefügt. Leider versehentlich an der falschen Stelle! Aber das ändert nichts an der Situation, dass die Geschwindigkeit zu langsam ist bzw. nicht das was ich letztendlich haben will. Circle funktioniert ja auch nicht. Vielleicht kriege ich das irgendwie noch hin?
Edit:
Mit Sleep 1 zu langsam und ohne Sleep zu schnell
Ich muss doch die Geschwindigkeit irgendwie regeln können? Das kann doch nicht sein, dass das nicht klappt?
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 25.01.2016, 00:45 Titel: |
|
|
Wenn ich eine Grafik schneller bewegen will, zeichne ich üblicherweise in größeren Schritten - also z. B. nicht immer um ein Pixel versetzt, sondern um zwei oder mehr. Schneller als 60 Millisekunden kann das menschliche Auge sowieso nicht sehen.
Zitat: | Selbst mit Circle ist die Geschwindigkeit nicht das was ich will. |
CIRCLE ist auch ein sehr langsamer Befehl, deutlich langsamer als PUT. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 25.01.2016, 17:41 Titel: |
|
|
St_W hat Folgendes geschrieben: | Der kontrollierte Ablauf einer Animation ist ein vielfach auftretendes Problem, zu dem es einiges an Dokumentation gibt. In der Schleife mit SLEEP eine Wartezeit einzufügen ist die einfachste Lösung, aber kann schnell zu unterschiedlicher Laufzeit auf unterschiedlich schnellen Rechnern führen. Der folgende Artikel erklärt das Problem und mögliche Lösungsansätze:
http://gameprogrammingpatterns.com/game-loop.html
Hier sind auch noch einige Verweise auf weiterführende Artikel zu dem Thema:
http://gamedev.stackexchange.com/questions/651/tips-for-writing-the-main-game-loop
Bei einer Internet Recherche solltest du aber ganz leicht etliche Artikel zu diesem Thema finden. | Uff, englische Artikel. Hoffentlich reichen meine Englischkenntnisse aus? Ich öffne nämlich ungern Seiten, die in Englisch verfasst sind. Mir sind Internetseiten auf deutsch am liebsten.
Zitat: | Wenn ich eine Grafik schneller bewegen will, zeichne ich üblicherweise in größeren Schritten - also z. B. nicht immer um ein Pixel versetzt, sondern um zwei oder mehr. Schneller als 60 Millisekunden kann das menschliche Auge sowieso nicht sehen. |
Also bleibt mir nichts anderes übrig, als in größeren Schritten zu zeichnen? Auch gut. Wenn es zuviel Schritte sind, sieht es meiner Meinung nach nicht mehr so schön aus? Ich kann mir nicht vorstellen, dass bei Bildschirmschonern von Microsoft oder anderen, mehr als 2 Schritte gezeichnet wird. Zumindest sieht es nicht danach aus!
Tausend dank für all diejenigen die mir bis jetzt geholfen haben!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 25.01.2016, 18:48 Titel: |
|
|
versuchs mal mit screensync:
Code: | ScreenRes 640, 480, 32
Dim As Long a=4, b=4, x=320, y=240
Do
ScreenLock
Circle(x, y), 5, 0,,,, F
x+=a
y+=b
Circle(x, y), 5, -1,,,, F
ScreenUnLock
ScreenSync
If x<5 Or x>635 Then a*=-1
If y<5 Or y>475 Then b*=-1
If MultiKey(&h01) Then End
Loop |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 26.01.2016, 00:52 Titel: |
|
|
Hallo ALWIM!
So habe ich das Problem der Animationsgeschwindigkeit bei Colochessum gelöst:
Code: | ...
timeRem = Timer
Do While px1 <> px2 Or py1 <> py2
If Timer > timeRem + .001 * animationSpeed Then
timeRem += .001 * animationSpeed
'update coordinates
If px1 <> px2 Then
px1 = px1 + dx
End If
If py1 <> py2 Then
py1 = py1 + dy
End If
ScreenLock
Put (ox,oy),sImage,PSet 'restore old background
Get (px1,py1)-(px1+41,py1+41),sImage 'save new background
Put (px1,py1),iPiece(choice),Trans 'place on new background
ox = px1
oy = py1
ScreenUnLock
Scan
EndIf
Loop
... |
Die Variable animationSpeed enthält die Anzahl der Millisekunden zwischen zwei Animationsschritten (je mehr desto langsamer). Diese Vorgehensweise hat den Vorteil, daß die Animationsgeschwindigkeit im Mittel sehr konstant ist, auch wenn die Animationsroutine in unregelmässigen Abständen aufgerufen wird.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
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.
|
|