LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Ara
Beiträge: 35
Registriert: 29.08.2004 13:40

LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Beitrag von Ara »

Ich habe schon wieder eine Frage mit einem Beispiel das keinen Sinn ergibt.
Es geht um die Schrift Kursiv.
Ich versuche mich gerade ein wenig in PureBasic einzuarbeiten und mache einige Versuche und dabei vor allem wie lange es dauert.
Hier ein kleines Beispiel bei dem zwei Schriften geladen werden.
Die erste ist Normal, die zweite mit dem Parameter #PB_Font_Italic.
Die Schrift wurde extra groß gewählt, da man es da besonders gut sieht.
Es gibt nur eine Ausgabe der verstrichenen Zeit des Befehls DrawingFont(FontID(#Font_X)).
Kann man die Verzögerung irgendwie umgehen oder sollte man die Schriftart #PB_Font_Italic bei Sprites vermeiden, wenn sich ein Text auf dem Sprite alle paar Sekunden ändert.

Code: Alles auswählen

InitSprite()

EnableExplicit

Global StartTime.q

Enumeration Window
  #Window
EndEnumeration

Enumeration Font
  #Font_0
  #Font_1
EndEnumeration

Enumeration Font
  #Sprite_0
  #Sprite_1
EndEnumeration

LoadFont(#Font_0, "Arial", 500)
LoadFont(#Font_1, "Arial", 500, #PB_Font_Italic)

OpenWindow(#Window, 0, 0, 1000, 550, "")
OpenWindowedScreen(WindowID(#Window), 0, 0, 1000, 550)

CreateSprite(#Sprite_0, 1000, 550)
CreateSprite(#Sprite_1, 1000, 550)

StartDrawing(SpriteOutput(#Sprite_0))
StartTime = ElapsedMilliseconds()
DrawingFont(FontID(#Font_0))
Debug ElapsedMilliseconds() - StartTime
StopDrawing()

StartDrawing(SpriteOutput(#Sprite_1))
StartTime = ElapsedMilliseconds()
DrawingFont(FontID(#Font_1))
Debug ElapsedMilliseconds() - StartTime
StopDrawing()
Danke und Viele Grüße
Thomas
Win11 Pro
PureBasic 6.10 LTS
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Beitrag von ccode_new »

Dein Beispiel ergibt keinen Sinn.
Dies hast du ja selbst schon korrekt festgestellt.

Kannst du das Ganze nicht ordentlich in eine Eventschleife packen?
Außerdem muss die Ausgabe der Werte ohne Debug-Befehl erfolgen.

Wie groß ist den dein gemessener Unterschied?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Beitrag von STARGÅTE »

Hier mal ein vollständiges Beispiel:

Die Verzögerung ist echt übel. Bei mir sind es knapp 1.3 Sekunden! Ohne Italic ist es unter 5 Millisekunden!
Keine Ahnung was da los ist. Am Drawing selbst oder dem Sprite kann es nicht liegen. Aber was macht DrawingFont im Hintergrund?

Code: Alles auswählen

Enumeration
	#Window
	#Sprite
	#Font
EndEnumeration

InitSprite()
OpenConsole()

LoadFont(#Font, "Arial", 500, #PB_Font_Italic)

OpenWindow(#Window, 0, 0, 1280, 720, "DrawingFont", #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(#Window), 0, 0, WindowWidth(#Window), WindowHeight(#Window))

CreateSprite(#Sprite,  1280, 720)

Define StartTime.q

Repeat
	
	Repeat
		
		Select WindowEvent()
			Case #PB_Event_None
				Break
			Case #PB_Event_CloseWindow
				Break 2
		EndSelect
		
	ForEver
	
	If StartDrawing(SpriteOutput(#Sprite))
		StartTime = ElapsedMilliseconds()
		DrawingFont(FontID(#Font))
		DrawText(0, 0, Str(StartTime))
		PrintN(Str(ElapsedMilliseconds() - StartTime))
		StopDrawing()
	EndIf
	
	ClearScreen($000000)
	
	DisplaySprite(#Sprite, 0, 0)
	
	FlipBuffers()
	
ForEver

End
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Beitrag von ccode_new »

Hi!
Das Problem tritt aber nur unter Windows auf. (teilweise fast 5 Sekunden ohne Debugger)
Unter Linux oder MacOS sind beide Varianten (italic oder normal) circa gleich schnell. (sehr wenige MIllisekunden)

Was ist da denn los?
Was passiert da im Hintergrund?

Also wenn ich mit der SDL2-Lib unter Window eine "Arial.ttf"-Font lade und diese mit diesen Style setze:
sdl::TTF_SetFontStyle(*font, sdl::#TTF_STYLE_Italic)
ist das in 1-2 Millisekunden erledigt.

???
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benubi
Beiträge: 187
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Beitrag von Benubi »

Gab es nicht mal so etwas wie bösartige Fonts, mehr so im Webbrowser Bereich? Bei mir dauert der Frame-Wechsel ca. 600ms.
Manche Fonts sind sehr langsam und andere wiederum schneller. Einige eignen sich nicht fürs Echtzeit-Drawing.

Ich glaube es sind ja auch Vektor-Grafiken oder sowas die da gerendert werden für jedes einzelne Symbol, je größer die Zeichen um so mehr Pixel müssen da "kompliziert" berechnet werden. Nur Bitmap-Fonts sind vorberechnet und dürften theoretisch immer noch am schnellsten sein, aber die sehen halt nicht so hübsch aus, man kann sie nicht in "alle" größen skallieren.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Beitrag von ccode_new »

Mahlzeit!

Das hat bestimmt nichts mit bösartigen Schriftarten zu tun.

Aber vielleich hat es etwas mit Kantenglättung, der verwendeten API-Befehle, etc. zu tun.
Oder es gibt einfach einen oder mehrere unschöne Fehler in der PureBasic DrawingFont Funktion für Windows.

???
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Beitrag von tft »

Hallo,

soweit ich mich erinnere. Ist der Italic ein Vektorfont. Und der Normal ein ThruType. Beides Funktioniert anders.
Vector auf ein Canvas ist schneller als auf ein Sprite. In dem Beispiel ist Italik 10 Mal langsamer.
Was mich selber jetzt auch nicht verwundert. Aber da es in der Form auch nie Verwendung findet.
Wurde das wahrscheinlich nie Optimiert. Ist das mit dem Kursive relevant oder nur zu testzwecken?
Ich mach das immer so. Das ich eine Textseite einrichte. Diese einmal zeichne und dann immer wider
zeichne . Und die Stelle die sich verändert. Zum Beispiel der Timer. Wird separat, alle 16 MS erneuert.
So Frist es zu viel gesamt Performance. Oder Wenn mehrere solche Zeitfresser da sind. Eben abwechselnd.
Man muss sich immer gut überlegen. Was mus erneuert werden. Und was kann ich wider verwenden.

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Beitrag von ccode_new »

Das Problem liegt an der Texturgröße und wie PureBasic die Zuweisung der Schriftgröße handhabt.

Der Faktor ist die Schriftgröße.

Außerdem ist ein permanentes Zeichnen auf einem Sprite sowie so sehr ineffizient. (Anmerkung zum Beispiel von STARGÅTE)
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Ara
Beiträge: 35
Registriert: 29.08.2004 13:40

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Beitrag von Ara »

Danke für die Info.
Es ist nichts wichtiges, es waren nur ein paar Versuche und da ist es mir aufgefallen.
Es war der Versuch, eine Uhr auf den Bildschirm zu bringen mit einer großen Anzeige und die sollte sich drehen.
Mit der Drehung ist es da vorbei. So etwas ähnliche gibt es auch als Bildschirmschoner mir einer 3D Schrift, ruckelfrei.
Man sollte also schräg Schrift vermeiden, wenn sich der Text ändert.

Noch einmal Danke und Viele Grüße
Thomas
Win11 Pro
PureBasic 6.10 LTS
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Beitrag von ccode_new »

...
Zuletzt geändert von ccode_new am 11.01.2023 19:38, insgesamt 1-mal geändert.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten