DrawText Optimieren... ?
Übersicht

![]() |
Mathias-KwiatkowskiBetreff: DrawText Optimieren... ? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() 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 ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ^^ ![]() |
||
![]() |
Lobby |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group