Ist es sinnvoll, FreeType [geschlossen] zu verwenden?

8

Wird es mein Spiel nicht verlangsamen, wenn ich FreeType lib verwende und 2 Schriftarten aus .ttf konvertiere, anstatt vorinstallierte BitmapFont .png zu verwenden? Oder kann FreeType so schnell sein, dass ich Schriftarten in beide Richtungen verwenden kann? Ich muss nur Farbe und Größe meines Textes ändern. PS Ich verwende 3 Schriftarten in meinem Projekt

Divelix
quelle
Abstimmung zum Abschluss, da die Antworten ausschließlich auf Meinungen basieren. Was "zu langsam" ist, ist immer subjektiv für die Anwendung. Das 60-malige Dekodieren einer Freetype-Schriftart ist wahrscheinlich zu langsam, während das einmalige Laden der Schriftart beim Start wahrscheinlich keinen Unterschied macht, aber alles dazwischen hängt immer von der Anwendung, der Schriftart und allem anderen ab. Das Laden des PNG kann sogar länger dauern als das Laden der Schriftart.
Aufstand
@Riot, also um zu antworten "Wird es meine Bewerbung verlangsamen", sagst du "Ja" . Ich sehe hier keine Anforderung für "zu" langsam. VTLO.
Gnemlock
Ich sage jedoch nicht "es wird Ihre Anwendung verlangsamen". Das Laden einer Schriftart braucht Zeit, aber das kann einmal durchgeführt werden und kostet Sie zu Beginn einmalige 5 ms und das war's - oder es kann Sie eine Menge Zeit kosten, wenn Sie immer wieder neue Schriftarten laden, es hängt ganz davon ab, wie Sie erneut implementieren. Das Laden eines PNG kostet Sie auch Zeit. Alles, was Ihre Anwendung tut, wird sie aus logischer Sicht "verlangsamen". Hier kann es keine allgemeinen Antworten geben.
Aufstand

Antworten:

13

Wenn Sie eine Font-Rendering-Engine wie FreeType verwenden, besteht der häufigste Fehler darin, Zeichenfolgen in jedem Frame neu zu rendern. Dies ist sinnlos, da beim Rendern einer Zeichenfolge diese normalerweise mindestens einige Sekunden lang unverändert auf dem Bildschirm angezeigt wird.

Wenn Sie einen Text anzeigen möchten, rendern Sie diesen Text einmal in eine Textur und zeichnen Sie diese Textur, anstatt den Text erneut zu rendern. Wenn Sie dies tun, fallen die Kosten für das Rendern von Text nur an, wenn Sie zum ersten Mal eine bestimmte Zeichenfolge mit bestimmten Einstellungen rendern müssen. In jedem nachfolgenden Frame sind die Kosten für die Anzeige dieser Zeichenfolge dieselben wie für das Zeichnen eines anderen Sprites dieser Größe.

Eine Lösung, die ich in verschiedenen Projekten als sehr praktisch empfand, bestand darin, eine TextRenderingCacheKlasse zum Verwalten zwischengespeicherter Schriftwiedergaben zu haben. Es hat normalerweise eine Hash-Tabelle mit Zeichenfolge plus Rendereinstellungen (Schriftart, Farbe, Größe usw.) als Schlüssel und eine Textur mit dem Rendering als Wert. Wenn ein bestimmtes Rendering von der TextRenderingCache-Klasse angefordert wird, wird geprüft, ob dieses Rendering bereits vorhanden ist, und wenn nicht, wird eines erstellt. Das Löschen von Renderings aus der Hash-Map, die einige Sekunden lang nicht verwendet wurden, um Speicherverluste zu vermeiden, ist optional (einige Spiele benötigen dies, andere nicht).

Übrigens: FreeType verfügt bereits über ein Rendering-Cache-System . Es wird jedoch nur verwendet, wenn Sie es explizit verwenden.

Philipp
quelle
4

Ja, Freetype ist angemessen. Wenn Sie PNG - Dateien verwenden, müssen Sie einen für jede Größe und jede Farbe machen, und das belegen kann 10 - mal den Raum eine .ttf - Datei in Anspruch nimmt. Auf Wiedersehen, freier Speicherplatz auf Android- und iOS-Geräten. Außerdem müssen Sie nur 1 .ttf-Datei erhalten, und das war's. Hoffe ich habe dir geholfen!

ShivGames
quelle
2
Sie können SDF und Shader verwenden - eine Bitmap für jede Schriftart für alle Größen und Farben. Wiederum sollte die Leistung von Freetype wahrscheinlich das Letzte sein, was man optimieren sollte.
Wondra