  | 
					
						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 | 
	 
	
		Sarevok
 
 
  Anmeldungsdatum: 23.03.2011 Beiträge: 2
 
  | 
		
			
				 Verfasst am: 23.03.2011, 16:43    Titel: Geschwindigkeitsproblem | 
				     | 
			 
			
				
  | 
			 
			
				Hallo
 
 
Ich bin ein absoluter Neuling im Bereich Freebasic und habe, obgleich ich mich mit Hardware und Assembler, sowie SQL und HTML gut auskenne, bisher noch nicht mit einer "richtigen" Programmiersprache gearbeitet.
 
 
Bei meinen ersten Gehversuchen in diesem Bereich hatte ich bisher keine Schwierigkeiten und habe dann aus Interesse einmal folgendes kurzes Programm geschrieben:
 
 
 
screen 20,32
 
dim x as integer
 
dim y as integer
 
do
 
    getmouse x,y
 
    pset (x,y)
 
loop
 
end
 
 
Dieses Programm fragt die Mausposition ab und setzt dann dort einen Punkt.
 
Allerdings wird daraus bei schnellen Mausbewegungen keine Linie sondern nur einzelne Punkte.
 
Ich würde gerne wissen woran das liegt denn mein PC müsste auf jeden Fall schnell genug sein um da eine durchgehende Linie zeichnen zu können  
 
Liegt es an schlechten Algorithmen des Compilers oder wo sonst ist das Problem?
 
Über Hilfe würde Ich mich sehr freuen. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		XOR
 
 
  Anmeldungsdatum: 23.07.2010 Beiträge: 161
 
  | 
		
			
				 Verfasst am: 23.03.2011, 18:23    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Das ist immer so mit der Maus.
 
Mache es So:
 
 	  | Code: | 	 		  screen 20,32
 
dim as integer x, y, xAlt, yAlt
 
do
 
 xAlt = x
 
 yAlt = y
 
 getmouse x,y
 
 line(x,y)-(xAlt,yAlt)
 
loop until multikey(1) 'Mit ESC abbrechen
 
end | 	  
 
nicht getestet, sollte aber gehen, hier wird eine linie zwischen altem und der neuen Mausposition gezeichnet, so das keine luecken entstehen. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Sebastian Administrator
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
  | 
		
			
				 Verfasst am: 23.03.2011, 18:32    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
 
hier noch ein ausführlicherer Vorschlag:
 
 	  | Code: | 	 		  dim as integer x1=-1, x2, y1, y2
 
screen 20,32
 
Print "Maus bewegen und dann beliebige Taste zum Beenden druecken."
 
setmouse (511,383)  'Startposition der Maus setzen
 
do
 
    getmouse x2, y2
 
    if (x2 >= 0) AndAlso (y2 >= 0) AndAlso ((x2 <> x1) OrElse (y2 <> y1)) then
 
        '-> Es handelt sich um ein gueltiges Koordinatenpaar (=Maus im Fenster),
 
        '   da x2 >= 0 und y2 >= 0
 
        '-> Die Mausposition hat sich seit dem letzten GETMOUSE veraendert, d.h.
 
        '   wir muessen etwas zeichnen, da (x1,y1) <> (x2,y2)
 
        '-> Hinweis:  "ANDALSO" ist && in C, waehrend "AND" einem & entspricht.
 
        if (x1 >= 0) then  'Gibt es eine vorherige Koordinate oder ist es die erste?
 
            line (x1, y1)-(x2, y2)  'Es gibt eine vorherige -> Linie zeichnen
 
        else
 
            pset (x2, y2)  'Keine vorherige -> nur einen Punkt zeichnen
 
        end if
 
        x1 = x2
 
        y1 = y2
 
    end if
 
    sleep 1  'CPU-Auslastung reduzieren
 
loop until inkey <> ""  'Ausfuehren bis Tastendruck erfolgt
 
end | 	  
 
 
Viele Grüße!
 
Sebastian _________________
  
 
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Sarevok
 
 
  Anmeldungsdatum: 23.03.2011 Beiträge: 2
 
  | 
		
			
				 Verfasst am: 23.03.2011, 18:34    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Es funktioniert, vielen Dank für Eure schnelle Hilfe.
 
 
Heißt das es liegt an dem Befehl getmouse weswegen es sonst nicht funktioniert? | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Flo aka kleiner_hacker
 
  Anmeldungsdatum: 23.06.2006 Beiträge: 1210
 
  | 
		
			
				 Verfasst am: 23.03.2011, 18:50    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				sebastian, soweit ich weiß, ist AND statt ANDALSO (und analog OR statt ORELSE) bei vergleichen schneller.
 
jedes ANDALSO führt nen vergleich und nen sprung aus; ORELSE genauso.
 
das macht dann, genau dann und nur dann sinn, wenn du meinst:
 
 	  | Code: | 	 		  
 
if bedingung1 ANDALSO zeitraubende_funktion1() then
 
 | 	  
 
RND ist genau an der schwelle zwischen zeitraubend und nicht zeitraubend, das macht keinen riesigen unterschied.
 
bei vergleichen ist AND aber besser. weil nur EIN vergleich, und viele (schnelle!) logische operationen ausgeführt werden
 
 
IMHO und IIRC   _________________ MFG
 
Flo
 
 
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
 
 
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Jojo alter Rang
  
  Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
  | 
		
			
				 Verfasst am: 23.03.2011, 19:04    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Flo hat Folgendes geschrieben: | 	 		  | sebastian, soweit ich weiß, ist AND statt ANDALSO (und analog OR statt ORELSE) bei vergleichen schneller. | 	  Also bei sowas würde ich doch lieber den Optimierer arbeiten lassen (ok, geht in FB nicht, aber ganz allgemein). Es ist schon wesentlich nachvollziehbarer, wenn man AndAlso hinschreibt. Zudem bin ich mir sicher, dass x86 da irgendwelchen kranken Opcodes hat, die AndAlso genau so schnell machen (Vergleich + Sprung in einem Befehl oder so irgendwas in der Art müsste ja klappen) _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Flo aka kleiner_hacker
 
  Anmeldungsdatum: 23.06.2006 Beiträge: 1210
 
  | 
		
			
				 Verfasst am: 23.03.2011, 19:50    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				echt, andalso ist lesbarer als ein reines "and"?
 
ich finde, das macht keinen allzugroßen unterschied; ist wohl geschmackssache (wobei ich auch && anschaulich finde   )
 
 
soweit ich weiß, ist das ARM, aber nicht x86, das die "vergleiche-und-springe"-befehle in einem befehl hat
 
 
generell habe ich aber mal einen test gemacht, bei dem rausgekommen ist, dass gerade bei "normalen" vergleichen (also keinen funktionsaufrufen) AND signifikant (2x bis 3x) schneller ist als ANDALSO; allerdings bei fb0.17 _________________ MFG
 
Flo
 
 
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
 
 
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Jojo alter Rang
  
  Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
  | 
		
			
				 Verfasst am: 23.03.2011, 19:56    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Flo hat Folgendes geschrieben: | 	 		  echt, andalso ist lesbarer als ein reines "and"?
 
ich finde, das macht keinen allzugroßen unterschied; ist wohl geschmackssache (wobei ich auch && anschaulich finde   ) | 	  
 
Das war jetzt nicht auf die tasächliche Lesbarkeit des Codes bezogen (da bevorzuge ich eh &&  ), sondern auf die semantische Nachvollziehbarkeit. And ist halt eigentlich eine Bitweise kombination. _________________ » 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.
  | 
   
 
     |