DrawText Optimieren... ?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: DrawText Optimieren... ?

BeitragMo, Jan 07, 2013 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
hi leute mir ist aufgefallen das drawtext eigentlich sehr langsamm ist...

habe 2 bsp dafür die bei mir zumindest 102 MS brauchen, sprich beide codes brauchen so "lange",

und nun die frage wie löse ich das problem? ist es vieleicht ratsammer den taxt einmal zu zeichnen, dann ein createimage zu erstellen, und den text als image darzustellen? (also den sichtbaren text zumindest)



Code 1:
Code: [AUSKLAPPEN]
Global MyTextArea:TTextArea
Type TTextArea
   Global TextAreaList:TList = New TList
   Field Text:String
   
   Function AddText(Text:String)
      MyTextArea:TTextArea = New TTextArea
      MyTextArea.Text = Text

      TextAreaList.Addlast MyTextArea
   End Function

   Function Draw:String(x:Int, y:Int)
      For texts:TTextArea = EachIn TTextArea.TextAreaList
         DrawText texts.Text, x, y + WY
         WY = WY + TextHeight("W")
      Next
   End Function
End Type

For t = 0 To 10000
   TTextArea.AddText("LOL " + t)
Next

Graphics 1000, 800
Repeat
   Cls
   MS_Start:Int = MilliSecs()
   TTextArea.Draw(0, 0)
   DrawText (MilliSecs() - MS_Start), 500, 10
   
   
   
   
   Flip
Until KeyDown(KEY_ESCAPE)
End


Code 2:
Code: [AUSKLAPPEN]
Text:String = ""
For t = 0 To 10000
   Text = Text + "LOL " + t + "~n"
Next

Graphics 1000, 800
Repeat
   Cls
   MS_Start:Int = MilliSecs()
   DrawText Text, 0, 0
   DrawText (MilliSecs() - MS_Start), 500, 20
   
   
   
   
   Flip
Until KeyDown(KEY_ESCAPE)
End
 

PhillipK

BeitragMo, Jan 07, 2013 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Das liegt in der natur von DrawText. Ja es ist lahm, nein, du solltest es nicht nutzen.
klar, "mal" nen text ausgeben ist nicht so schlimm, aber es geht nun wirklich schneller.

Die idee, GrabImage() zu machen ist an sich ein guter ansatz.

Zu deinem code:
Hast du den code länger laufen lassen? Beim ersten durchlauf dürfte der wert weitaus höher sein, da zu beginn erstmal der text überhaupt erstellt wird (wenn ich mich recht entsinne).
Wenn 102ms die durchschnittszeit sind, dann läuft da doch schon einiges verquer... wieviel text ist es denn?

Zur lösung des problems bleibt nicht viel zu sagen. Mach. Es. Selbst. Very Happy
Es gibt im Showcase ein tool namens "Fontmaker" - ich schwöre auf dieses ding.
Es generiert dir ein bild aus einem font, farbeinstellungen etc etc etc und speichert eine datei, welche du auslesen kannst. Diese datei hält informationen zu den x/y koordinaten im sourcebild, ebenso höhe / breite für die buchstaben.
Beigeliefert ist ausserdem ein beispielcode, wie du es auslesen kannst Smile

Anhand dieser daten und des codes könntest du dir ziemlich leicht ein optimiertes, eigenes, Textobjekt schreiben. Zumindest meine "dreckigen" varianten sind ziemlich schnell.. was ist schon 100x DrawImage im vergleich zu 102ms Smile

Alternativ bleibt dir, wie du schon sagtest, die "vorrender" - geschichte. Merke aber: auch GrabImage() / GrabPixmap() sind im vergleich ZIEMLICH langsam. Dh das vorrendern lohnt nur bei statischen texten und sollte zu beginn eines programmes bzw in der ladephase durchgeführt werden.

Mathias-Kwiatkowski

BeitragMo, Jan 07, 2013 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
mhh du hast recht naja wieviele buchstaben es sind siehste an bsp 2
habe nun mal folgendes probiert:

Code: [AUSKLAPPEN]
Text:String = ""
For t = 0 To 10000
   Text = Text + "LOL " + t + "~n"
Next

Graphics 1000, 800
Repeat
   Cls
   MS_Start:Int = MilliSecs()
   DrawText Mid(Text, 100, 100), 0, 0
   DrawText (MilliSecs() - MS_Start), 500, 20
   
   
   
   
   Flip
Until KeyDown(KEY_ESCAPE)
End


das dauert nun genau 0 ms ^^ liegt daran das halt nur 100 buchstaben "gemalt" werden, scheint sehr nützlich ^^ Very Happy aber dieser fontmaker den werd ich mir ma ansehen.

Lobby

BeitragMo, Jan 07, 2013 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest sicher stellen, dass deine Textarea nur das zeichnet, was auch zu sehen ist (Gleiches gilt dann auch für das Verarbeiten von Benutzereingaben).

Eine ImageFont ist intern auch nur eine Textur von der je nach Buchstaben ein Bereich gezeichnet wird. Das Geschwindigkeitsproblem hieran ist, dass eben jeder Buchstabe einzeln eingezeichnet wird. Auch eine vorgerenderte Bitmapfont würde hier nicht helfen.

Einfach weil ich es für angebracht halte verweise ich an dieser Stelle auch auf FastText, ein Modul von mir welches eben mit dem Vorrendern ganzer Texte arbeitet.
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group