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:

Grafikgeschwindigkeiten verbessern?

 
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
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 957
Wohnort: Niederbayern

BeitragVerfasst am: 24.01.2016, 19:10    Titel: Grafikgeschwindigkeiten verbessern? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 24.01.2016, 19:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 236

BeitragVerfasst am: 24.01.2016, 20:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 957
Wohnort: Niederbayern

BeitragVerfasst am: 24.01.2016, 20:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 903
Wohnort: Austria

BeitragVerfasst am: 24.01.2016, 21:52    Titel: Antworten mit Zitat

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.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4189
Wohnort: ~/

BeitragVerfasst am: 24.01.2016, 23:45    Titel: Antworten mit 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.

Zitat:
Selbst mit Circle ist die Geschwindigkeit nicht das was ich will.

CIRCLE ist auch ein sehr langsamer Befehl, deutlich langsamer als PUT.
_________________
Meine Großeltern waren als junge Menschen sehr modern - sie hatten schon damals in der Badewanne Email.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 957
Wohnort: Niederbayern

BeitragVerfasst am: 25.01.2016, 16:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1855
Wohnort: D59192

BeitragVerfasst am: 25.01.2016, 17:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 830
Wohnort: Ruhrpott

BeitragVerfasst am: 25.01.2016, 23:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
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