FastText

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Lobby

Betreff: FastText

BeitragDi, Feb 28, 2012 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie funktioniert das max2D interne DrawText? Ganz einfach, bei jedem Aufruf wird der übergebene String Buchstabe für Buchstabe separat gezeichnet. Soweit so gut, aber wenn man viel Text verwendet bedeutet das daher auch, dass sehr sehr viele Bilder eingezeichnet werden müssen, und das für jeden Frame. Im Endeffekt kann das dazu führen, dass keine Zeit mehr für andere, auch nicht grafische Dinge bleibt, ohne dass das Programm zu ruckeln anfängt.
Die Lösung: Texte, die sich selten ändern (sagen wir höchstens einmal alle 10 Sekunden), können vorgerendert und später als einzelnes Bild eingezeichnet werden. Da das Vorrendern je nach Textgröße sogar ebenfalls recht zügig abläuft, ist ein erneutes Rendern kein Problem, zudem sollten keine Ruckler auftreten.

Hierfür stellt das Modul lobby.fasttext einige Funktionen bereit, zudem kann man auf ein manuelles Verwalten der vorgerenderten Texte verzichten und stattdessen wie mit DrawText arbeiten (nur eben in den meisten Fällen schneller).

Gedownloaded kann das Ganze hier werden (gewöhnliches ZIP-Archiv der Größe 1,08 MB).

Kurz die Hauptfunktionen (der Klasse TFastText):
  • TFastText.renderStaticText(txt:String, x:Float, y:Float, ttl:Int = 2)
    Kann als Pendant zu DrawText angesehen werden, nur halt eben dass der zu zeichnende Text fürs zukünftige Einzeichnen vorgerendert und gespeichert wird. Der Parameter ttl bestimmt, wie lange das Bild bei Nichtverwendung höchstens im Speicher gehalten werden soll (2 entspricht 200ms)

  • TFastText.collectGarbage()
    Sollte in jedem Schleifendurchgang (oder manuell alle 100ms) aufgerufen werden, damit nicht mehr benötigte Bilder wieder aus dem Speicher freigegeben werden können

  • TFastText.countPrerenderedTexts:Int()
    Gibt die Anzahl der im Speicher befindlichen, vorgerenderten Texte zurück

  • TFastText.renderTextToImage:TImage(t:String, lineSpace:Int = 0)
    Rendert einen Text auf ein Bild vor, damit man das Handling selbst übernehmen kann. lineSpace wird zum Zeilenabstand zwischen den Zeilen hinzuaddiert (nur bei mehrzeiligen Texten von Bewandnis, als Zeilenumbrüche werden chr(10) erkannt). als TImageFont wird die zuletzt mit SetImageFont gesetzte verwendet


Es ist ein (für Windows vorkompiliertes) Beispiel enthalten, welches neben der Verwendung auch den möglichen Geschwindigkeitszuwachs zeigen soll. Per Leertaste kann zwischen den Modi kein FastText, FastText nur für einzelne Zeilen und Fasttext für Textblöcke gewechselt werden. Die jeweiligen FPS waren bei mir durchschnittlich 50, 450 und 900. Hier noch ein Bild des Beispiels:
Ich bin ein Link zu einem Bild
Sicherlich, es ist unwahrscheinlich, dass Ihr einen solch langen Text in einem Spiel verwendet (und ihn dann zwecks des Schattens auch noch gleich zweimal zeichnet), aber aus Erfahrung weiß ich, dass bei größeren Projekten auch schon bedeutend weniger Text reicht um die FPS merklich zu drücken, insbesondere, wenn bereits sehr viele Grafiken gezeichnet werden müssen.
Mich würde interessieren, wie bei euch so die Zeitersparnisse sind und ob es sich auch in bereits bestehenden Projekten merklich auswirkt.
  • Zuletzt bearbeitet von Lobby am Mo, Aug 07, 2017 16:22, insgesamt 4-mal bearbeitet

DAK

BeitragDi, Feb 28, 2012 23:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei deinem Sample hab ich die folgenden Werte: 26ms/37fps, 1ms/999fps, <1ms,>1000fps

Der Geschwindigkeitszuwachs ist also enorm.
Hab im Moment kein Projekt, wo ich das gut verwenden könnte, hab aber eins im Kopf, wo ichs einsetzen könnte. Bleibt ganz sicher in meinem mod-Verzeichnis, vielen Dank.
Gewinner der 6. und der 68. BlitzCodeCompo

Lobby

BeitragMi, Feb 29, 2012 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für das Testen, DAK, der Geschwindigkeitszuwachs scheint ganz annehmbar zu sein.
Ich habe zudem festgestellt, dass sich über diese Methode auch solche unscharfen Texte vermeiden lassen, wie sie bei bestimmten Hardwarekonfigurationen und Einstellungen leider hin und wieder auftreten können:
user posted image
(Danke thunder, für das Bild)

Ich habe noch vergessen zu erwähnen, dass diese Methode den Text zu zeichnen natürlich etwas Speicherlastiger ist als das normale Zeichnen, aber eine kleine Rechnung zeigt, dass das für heutige Rechner kein Problem darstellen sollte:
Bei einer Auflösung von 800x600 Pixeln (es ist unwahrscheinlich, dass die Textbedeckende Fläche so groß ist) hat man 480.000 Pixel für die jeweils 1 Byte an Speicher benötigt wird. Somit werden für einen derartigen Text gerade einmal 480.000 Bytes = 468,75 KB = 0,458 MB benötigt. Speichertechnisch braucht man sich also hier wirklich eher weniger zu sorgen, insbesondere wenn man an die Relation zum Geschwindigkeitszuwachs denkt.

Es ist noch darauf zu verweisen, dass die vorgerenderten Texte an die maximal unterstützte Texturgröße gebunden sind, sodass man darauf verzichten sollte, überdimensional riesige Texte vorzurendern (hier sollte man manuell den Text in kleinere Abschnitte einteilen lassen, denn gerade bei solchen Texten wäre DrawText weniger zu empfehlen (auch abhängig von der Schriftgröße natürlich).
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

bmurray

BeitragMo, Aug 07, 2017 11:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

leider ist die Datei nicht mehr hinterlegt. Hat jemand dieses Modul zufällig noch, und falls ja, würde er/sie es mir zusenden?

Lobby

BeitragMo, Aug 07, 2017 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Kein Problem, Links angepasst.
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

bmurray

BeitragMo, Aug 07, 2017 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Super! Vielen herzlichen Dank Very Happy

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group