Seite 1 von 2

LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Verfasst: 09.01.2023 16:48
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

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Verfasst: 09.01.2023 20:05
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?

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Verfasst: 09.01.2023 21:53
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

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Verfasst: 09.01.2023 22:51
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.

???

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Verfasst: 10.01.2023 12:46
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.

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Verfasst: 10.01.2023 13:09
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.

???

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Verfasst: 10.01.2023 14:41
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

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Verfasst: 10.01.2023 21:08
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)

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Verfasst: 11.01.2023 07:04
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

Re: LoadFont mit #PB_Font_Italic und DrawingFont extrem langsam

Verfasst: 11.01.2023 13:11
von ccode_new
...