| 
				
					|  | 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: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 24.01.2016, 19: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, 19: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, 20: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: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 24.01.2016, 20: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: 958
 Wohnort: Austria
 
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 24.01.2016, 23: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: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 25.01.2016, 16:41    Titel: |   |  
				| 
 |  
				| 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. 	  | 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.
 | 
 
 
  	  | 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: 1876
 Wohnort: D59192
 
 | 
			
				|  Verfasst am: 25.01.2016, 17: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: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 25.01.2016, 23: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.
 
 |  |