Speedoptimierung?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Firstdeathmaker

Betreff: Speedoptimierung?

BeitragMi, Mai 12, 2004 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde gerne diesen Code optimieren, aber ich weis nicht genau wie...
Ich hab schon statt "print" "text" benutzt, aber es ist immer noch ellenlangsam. Wie könnte ich das schneller bekommen?



Code: [AUSKLAPPEN]
;Matrixbildschirmschoner
Modes=CountGfxModes()

If GfxModeExists(1280,1024,16)
   Graphics_X=1280
   Graphics_Y=1024
ElseIf GfxModeExists(1024,768,16)
   Graphics_X=1024
   Graphics_Y=768
ElseIf GfxModeExists(800,600,16)
   Graphics_X=800
   Graphics_Y=600
ElseIf GfxModeExists(640,400,16)
   Graphics_X=640
   Graphics_Y=400
EndIf

Graphics Graphics_X,Graphics_Y,32,1
Timer=CreateTimer(100)

Dim Feld((Graphics_X/10),(Graphics_Y/10),3);0=Zahl,1=c1,2=c2,3=c4
SetBuffer BackBuffer()

Abstd_X=10;Abstand der Zahlen auf der X Koordinate zueinander
Abstd_Y=11;Abstand der Zahlen auf der Y Koordinate zueinander


;Zufallszahlen setzen
For i=0 To Graphics_X/10
   For i2=0 To Graphics_Y/10

      Feld(i,i2,0)=Rand(0,9)
;      Feld(i,i2,1)=250;Rot
;      Feld(i,i2,2)=255;Grün
;      Feld(i,i2,3)=250;Blau
   Next
Next

Dim Reihe(Graphics_X/10,2);0=aktiv,1=Standortnummer,2=Diesen Durchgang schon benutzt.







Repeat
WaitTimer timer
SeedRnd MilliSecs()

Cls
For i=0 To Graphics_X/10

   If Reihe(i,0)=0 And Rand(0,100)=1 Reihe(i,0)=1

   For i2=0 To Graphics_Y/10
      If Reihe(i,0)=1 And Reihe(i,1)=i2 And Reihe(i,2)=0
         Feld(i,i2,1)=250
         Feld(i,i2,2)=255
         Feld(i,i2,3)=250
         Reihe(i,1)=(Reihe(i,1)+1)
         If Reihe(i,1)>(Graphics_Y/10) Reihe(i,1)=0 Reihe(i,0)=0
         Reihe(i,2)=1
      EndIf

   
      Color Feld(i,i2,1),Feld(i,i2,2),Feld(i,i2,3)
      Text i*Abstd_X,i2*Abstd_Y,Feld(i,i2,0)


      If Feld(i,i2,1)>0 Feld(i,i2,1)=Feld(i,i2,1)-50
      If Feld(i,i2,2)>0 Feld(i,i2,2)=Feld(i,i2,2)-5
      If Feld(i,i2,3)>0 Feld(i,i2,3)=Feld(i,i2,3)-50
   Next

   Reihe(i,2)=0
Next
;Framerate
counter=counter+1
If time<MilliSecs()
   time=MilliSecs()+1000
   frames=counter
   counter=0
EndIf
Color 255,0,0
Text 100,100,frames


Flip


Until GetKey()<>0



www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

Kekskiller

BeitragMi, Mai 12, 2004 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu dem Textproblem gibt es eine passende Lösung , welche sich Bitmapfont
nennt.
Hier mal ein kleiner Funktionscode
Code: [AUSKLAPPEN]

Function BmpPrint(msg$,x,y,font,center=0)
Select center
 Case 1
  laenge=Len(msg$)*ImageWidth(font)
  x=x-(laenge/2)
End Select
For z=1 To Len(msg$)
 zeichen$=Mid(msg$,z,1)
 If Asc(zeichen$)>=48 And Asc(zeichen$)<=57 Then
   DrawImage font,x+(z-1)*ImageWidth(font),y,Asc(zeichen$)-48+52
 Else
  If Asc(zeichen$)>=65 And Asc(zeichen$)<=90 Then
    DrawImage font,x+(z-1)*ImageWidth(font),y,Asc(zeichen$)-65+26
  Else
   If Asc(zeichen$)>=97 And Asc(zeichen$)<=122 Then
    DrawImage font,x+(z-1)*ImageWidth(font),y,Asc(zeichen$)-97
   Else
    Select zeichen$
     Case "!":imgnum=62
     Case "/":imgnum=63
     Case "(":imgnum=64
     Case ")":imgnum=65
     Case "=":imgnum=66
     Case "?":imgnum=67
     Case ".":imgnum=68
     Case ":":imgnum=69
     Case ",":imgnum=70
     Case ";":imgnum=71
     Case "~":imgnum=72
     Case "*":imgnum=73
     Case " ":imgnum=1000
    End Select
    If imgnum<>1000 Then DrawImage font,x+(z-1)*ImageWidth(font),y,imgnum
   EndIf
  EndIf
 EndIf
Next
End Function

Die Bilder der Buchstaben und Zahlen müssen in der folgender

Reihenfolge sein:
Kleinbuchstaben
Großbuchstaben
Zahlen
Sonderzeichen ( siehe bei dem Select-Block)

Klappt immer sehr schön und schnell soetwas.
Vielleicht hilft es ja.

Firstdeathmaker

BeitragMi, Mai 12, 2004 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn ich das jetzt richtig verstanden habe macht dein Code folgendes: Er zeichnet an die angegebene Stelle das Zeichen welches ich angebe (in ASII Code) als Image. Jetzt brauche ich also nur noch einen Bitmapfont?

Das Problem ist ja, dass ich sich dauernd verändernde Zeichen habe, von der Farbe her gesehen. Da sich die einzelnen Zeichen nicht alle gleichzeitig auf eine gemeinsame andere Farbe verändern, kann ich da schlecht mit allgemeinen Bearbeitungsmethoden arbeiten, da die ja alles verändern würden. So weit wie ich das verstanden habe müsste ich also 51 verschiedene Fonts haben? Oder habe ich da etwas missverstanden?

Ansonsten eine Grundsatzfrage: Ist BB schneller im Zeichnen von Images als im Zeichnen von Text mittels Textbefehl?
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

junky

BeitragMi, Mai 12, 2004 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
allerdings ist es das

hab dein bsp ma schnell umgecodet ( allerdings teilweise ziemlich drastisch - nicht weil es schlecht war, sondern weil es einfach nicht anners ging )

Code: [AUSKLAPPEN]

;Matrixbildschirmschoner
Modes=CountGfxModes()

If GfxModeExists(1280,1024,16)
   Graphics_X=1280
   Graphics_Y=1024
ElseIf GfxModeExists(1024,768,16)
   Graphics_X=1024
   Graphics_Y=768
ElseIf GfxModeExists(800,600,16)
   Graphics_X=800
   Graphics_Y=600
ElseIf GfxModeExists(640,400,16)
   Graphics_X=640
   Graphics_Y=400
EndIf


Graphics Graphics_X,Graphics_Y,32,1
SeedRnd MilliSecs()

Dim Feld((Graphics_X/10),(Graphics_Y/10),3);0=Zahl,1=c1,2=c2,3=c4
SetBuffer BackBuffer()

Abstd_X=10;Abstand der Zahlen auf der X Koordinate zueinander
Abstd_Y=11;Abstand der Zahlen auf der Y Koordinate zueinander



; 48 - 57   -> Zahlen von 0 - 9
; 65 - 90   -> große Buchstaben
; 97 - 122  -> kleine Buchstaben
AscIIStart = 48
AscIIStop  = 57



;Zufallszahlen setzen
For i=0 To Graphics_X/10
   For i2=0 To Graphics_Y/10

      Feld(i,i2,0)=Rand(AscIIStart,AscIIStop)
;      Feld(i,i2,1)=250;Rot
;      Feld(i,i2,2)=255;Grün
;      Feld(i,i2,3)=250;Blau
   Next
Next

Dim Reihe(Graphics_X/10,2);0=aktiv,1=Standortnummer,2=Diesen Durchgang schon benutzt.


;#############################################;
;=============================================;
; Bilder werden vorberechnet                  ;
; jede Zahl wird in den benötigten            ;
; Farbtönen (Frames) gezeichnet               ;
; a -> Zahl von 0 - 9                         ;
; b -> Grünton in 5er Schritten               ;
; c -> bestimmt in diesem Fall die Helligkeit ;
;=============================================;
font=LoadFont("Verdana",12)
SetFont(font)

Dim Image(AscIIStop)
For a=AscIIStart To AscIIStop
Image(a)=CreateImage(12,12,251)
Next

For a=AscIIStart To AscIIStop
   c=250
   For b=250 To 0 Step -5
      If c>0 : c=c-25 : EndIf
      SetBuffer(ImageBuffer(Image(a), b))
      Color(c,b,c)
      Text(0,0,Chr(a))
   Next
Next
;=============================================;
;#############################################;


SetBuffer(BackBuffer())

Repeat
Cls

For i=0 To Graphics_X/10

   If Reihe(i,0)=0 And Rand(0,100)=1 Reihe(i,0)=1

   For i2=0 To Graphics_Y/10
      If Reihe(i,0)=1 And Reihe(i,1)=i2 And Reihe(i,2)=0
         ;Feld(i,i2,1)=250
         Feld(i,i2,2)=250
         ;Feld(i,i2,3)=250
         Reihe(i,1)=(Reihe(i,1)+1)
         If Reihe(i,1)>(Graphics_Y/10) Reihe(i,1)=0 Reihe(i,0)=0
         Reihe(i,2)=1
      EndIf

      ; jeweilige Images (Frames) werden eingezeichnet
      ; aber nur, wenn das Image einen Grünton hat
      ; also in diesem Fall nicht schwarz ist
      If Feld(i,i2,2)<>0
         DrawBlock(Image(Feld(i,i2,0)), i*Abstd_X, i2*Abstd_Y, Feld(i,i2,2))
      EndIf


      ;If Feld(i,i2,1)>0 Feld(i,i2,1)=Feld(i,i2,1)-50
      If Feld(i,i2,2)>0 Feld(i,i2,2)=Feld(i,i2,2)-5
      ;If Feld(i,i2,3)>0 Feld(i,i2,3)=Feld(i,i2,3)-50
   Next

   Reihe(i,2)=0
Next

;Framerate
counter=counter+1
If time<MilliSecs()
   time=MilliSecs()+1000
   frames=counter
   counter=0
EndIf
Color 255,0,0
Text 100,100,frames



Flip



Until GetKey()<>0
End
gestern stand ich noch vorm Abgrund
heute bin ich einen Schritt weiter...
  • Zuletzt bearbeitet von junky am Mi, Mai 12, 2004 19:56, insgesamt einmal bearbeitet
 

Kekskiller

BeitragMi, Mai 12, 2004 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Achja , die Sache mit der Farbe ( doofer Keks ) .BB ist aufgrund
von DirectX ( soweit ich weiß ) wesentlich schneller im Zeichnen von
Bilder , als im Plotten oder Schreiben von Texten , allgemein ist die
Sache mit den Grafikfunktionen aus BB heraus ziemlich langsam ,
wie auch in anderen Sprachen.Als allererstes solltest du unbedingt
den 32bit-Modus runterschalten , ich bitte dich , bei simplen Textfunktionen
reicht auch 16bit locker aus.Zudem ist das Programm bei mir so ust
lahm , dass ich nicht mal nach einer Viertelstunde einen Sinn darin
erkennen kann ^^".Aber bei meinem Antiquariat ( Pentium I ) ist das
auch kein Wunder.Gibt es denn hier keine Superspeedcomputer , die
das Testen könnten?

Edit:Ah , so ist das schon viel schneller ^_^
Nur 32bit ist wirklich zu heftig.
Ich würde aus den einfachen Zahlen zufällige Asciicodes
machen , das kommt teils viel lebediger rüber.

sbrog

BeitragMi, Mai 12, 2004 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Post das ding doch mal ins codeforum .
Ist sehr interessant und und sieht Grafisch professionell aus.
Habs gleich als Wallpaper genommen Very Happy

Firstdeathmaker

BeitragDo, Mai 13, 2004 6:42
Antworten mit Zitat
Benutzer-Profile anzeigen
@ junky: Danke, ich werd jetzt mal deinen COde studieren und dazulernen. Darf ich deinen Code ins Code-Archiv stellen?
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

junky

BeitragDo, Mai 13, 2004 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
ehm Wink - natürlich darfste - Hab ja nur en bisl wat umgeändert und eigentlich denk ich, noch nit ma so besonders gut ( könnt man bestimmt noch mehr optimieren ). Im Prinzip war's ja dein Code...
gestern stand ich noch vorm Abgrund
heute bin ich einen Schritt weiter...

Firstdeathmaker

BeitragDo, Mai 13, 2004 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, ich hab das Ding noch ein klein wenig verändert (Geschwindikeit festgelegt [ironie: erst schneller wollen, dann die Geschwindigkeit wieder runterschrauben]) und stell es jetzt ins Codearchiv.

MFG
FDM
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group