Bitmap-Fonts sind nicht schneller ... ?

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Ayman

Betreff: Bitmap-Fonts sind nicht schneller ... ?

BeitragDo, Jan 20, 2005 2:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

hatte mir heute mal wieder vorgenommen meinen Code zu tunen, und dachte mir, ich sollte in dem Zusammenhang mal den "Text"-Befehl gegen einen selbstgeschriebenen auf der Basis von BMP-Fonts ersetzen. Ich hätte vorher wetten mögen, dass der schneller sein wird, aber ... denkste!

Habe mitlerweile ein knappes Dutzend Versionen von meiner LibBMPFont.bb bebaut. Doch alle Benchmarks zeigen, dass der Text-Befehl einfach schneller ist, grummel. Sad

Anm.: Ich verwende Blitz3D auf 'ner GF2 MX-400.

Was hab ich nicht alles versucht:
Ich lade meinen Monospace-Font (Zeichenmaß: 16x16, Anordnung gemäß ASCII-Tabelle) als Image und kopiere anschließend mit CopyRect oder DrawImageRect die einzelnen Zeichen (Asc (Mid$(meinText$, i, 1))) ins Ziel (FrontBuffer() oder BackBuffer()).
Die Positionsberechnung im Quell-Puffer geschieht mit AND bzw. SHL/SHR. ich verwende in der Schleife nur vordefinierte symbolische Variablen/Konstanten.

Ich habe auch eine Version, in der ich für jedes Zeichen ein eigenes Image definiert habe, das ich in einem Array abgelegt habe. Damit kann ich mir die Positionsberechnung im Quell-Puffer sparen ... haltet euch fest: die ist noch langsamer. In dieser Version setze ich die Zeichen mit DrawImage (ohne ...-Rect). Es gibt auch 'ne Variante mit CopyRect mit vorher abgelegten ImageBuffer (zeichenImage)-Werten. Bringt nix.

Dann hab ich mir gedacht, dass es möglicherwiese die vielen Copys zwischen RAM und VRAM sind (ich vermute die Images lieben möglicherweise im RAM), die die Sache langsamer machen, also hab den kompletten Text zunächst in einem Image zusammengebaut und das Ergebnis dann einmalig in die Darstellung hochgeschoben. Bringt auch nix.

Blöd ist, dass ich mit Blitz3D beim Erstellen eines Images nicht angeben kann, wo Blitz3D es lagert. Das geht wohl nur mit BB+.
Ich hab auch versucht Texturen (mit VRAM-Flag: 256) an Stelle von Images zu nehmen (bei einer Zeichengröße von 16x16 kein Problem), doch diese Texturen mit CopyRect von TextureBuffer(tex) nach Front-/BackBuffer() zu schieben, ist die langsamste Version.

Ich vermute, dass Windows die TTFs für die verwendete Größe intern als Bitmap im VRAM lagert und letztlich das gleiche macht: CopyRect. Nur scheint deren Code schneller - wohl weil sie die verwendete Speicherart bestimmen können ... ?

Irgendwelche Tipps? Oder hat irgendwer eine BMP-Font-Routine, die schneller ist als "Text" ?

Grüße
Ayman

EPS

BeitragDo, Jan 20, 2005 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
HI,

also ich habe in diversen Proggis mit Bitmapfonts gearbeitet und bin der Meinung sie sind schneller !

Vielleicht liegt es ja nicht an der "Text" Routine die du entwickelt hast - klingt eigentlich als wäre sie sehr schnell - vielleicht ist der Fehler ja im "umliegenden" Programm zu suchen.

Eine weitere Möglichkeit: Bei der Ausgabe eines Textes mit vielleicht 20 Zeichen oder so ist diese Methode in der Tat nicht sehr viel schneller als TEXT, bei der Ausgabe von etlichen Zeilen jedoch schon, teste das ganze mal mit nem Bildschirm voll Text - mach also mal ne Art Benchmark.

Wenn bei ca. 1000 Zeichen immer noch der Befehl TEXT schneller ist, dann haut irgend was nicht hin - denke ich jedenfalls.

Ayman

BeitragDo, Jan 20, 2005 15:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
also ich habe in diversen Proggis mit Bitmapfonts gearbeitet und bin der Meinung sie sind schneller!
Dann zeige mir bitte ein Beispiel in Blitz3D.

Zitat:
Vielleicht liegt es ja nicht an der "Text" Routine die du entwickelt hast - klingt eigentlich als wäre sie sehr schnell - vielleicht ist der Fehler ja im "umliegenden" Programm zu suchen.

Es gibt kein umliegendes Programm. Die Lib wird über ein Testmodul gestestet:Code: [AUSKLAPPEN]
; BMPF_Benchmark.bb
; V0.1, 2005/01/20, Ayman
; Test Modul / Benchmark für LibBMPFont.bb
;
Include "LibBMPFont.bb"

Graphics3D 1024, 768        ; wahlweise: Graphics 1024, 768
SetBuffer FrontBuffer()

; init BitmapFont
BMPF_SetFont BMPF_LoadFont ("wide16x16.png")

; init Windows True Type Font
SetFont LoadFont ("Arial", 24)

; Benchmark TTF
BMPF_Text 10,200, "DOING SOME BENCHMARKS ..."


; TTF
Color 255,255,0
t = MilliSecs()
For i = 1 To 10000
   Text 10,230, "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG."
Next
Text 10,250,"10000 outputs with TTF took "+Str(MilliSecs()-t)+" milliseconds."


; BMPF
t = MilliSecs()
For i = 1 To 10000
   BMPF_Text 10,300, "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG."
Next
BMPF_Text 10,320,"10000 outputs with BMPF took "+Str(MilliSecs()-t)+" milliseconds."


BMPF_Text 10,400, "HIT ANY KEY TO QUIT."
WaitKey()
End
Es sind zehntausend Durchläufe für jeden Kandidaten. "Text" braucht auf meinem Rechner (P3-800) um die 6600 Millisekunden. Mit Bitmapfonts brauche ich mindestens 20 % länger.

Zitat:
Wenn bei ca. 1000 Zeichen immer noch der Befehl TEXT schneller ist, dann haut irgend was nicht hin - denke ich jedenfalls.

??? ... deine Meinung in Ehren - die hatte ich vor diesem Experiment ja auch, aber einen Beweis bräucht es halt Wink

Aufruf
Bitte benchmarkt eure selbstgeschriebenen BMP-Font-Ausgaberoutinen mal - und vergleicht das mit dem Blitz eigene "Text"-Befehl. Wer dann immernoch glaubt, BMP-Fonts seien unter Blitz3D schneller, der kriegt 'nen Kuchen von mir.


Ayman,
der schon mal seinen Ofen anschmeißt ...

P.S.
user posted image
mein Selbstbau-BMP-Font
  • Zuletzt bearbeitet von Ayman am Do, Jan 20, 2005 16:06, insgesamt einmal bearbeitet
 

Dreamora

BeitragDo, Jan 20, 2005 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach die Bitmapfont in 3D und sie wird abzischen wie ne rakete ( also selbst quads zeichnen, nicht bilder zeichnen, denn das ist genau gleich hirnrissig wie die Variante die Text verwendet! )

1 Textmesh bei dem du die Quads entsprechend addest und es wird immer schneller und schneller je mehr text rein kommt, da der Text mehr oder weniger "konstant" bleibt je nach implementation, also nicht mal neu gezeichnet werden muss, während beim bitmap in jedem loopdurchlauf jeder buchstabe neu gezeichnet werden muss
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Ayman

BeitragDo, Jan 20, 2005 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dreamora:
Das klingt wahrlich klever! Wenn ich das richtig verstehe, wäre das dann je Buchstabe eine Surface. Das kann natrülich ne Menge Faces werden, aber ich muss in der Tat überhaupt nix mehr zeichnen oder kopieren, da die Zeichen als ein Array von Texturen daherkommen. Tolle Idee, warum komme ich eigendlich nie selbst auf so was? Wink

Ich mach mich mal dran.
 

Klaas

BeitragDo, Jan 20, 2005 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Da nochmal ne Anmerkung: Soweit ich weiß braucht Blitz etwas länger um verschiedene Texturen zu verarbeiten, da er nicht nach Texturen sortiert. Ich würde denken eine Textur mit allen Buchstaben drauf wird schneller laufen als viele einzelne Texturen.-
Die einzelnen Buchstaben würden dann mit U und V ausgewählt
Zudem würde ich dann auch nur eine Surface benutzen da dies wesentlich schneller ist.

Dies ist aber nur eine Annahme ... beschwören würd ichs jetzt nicht.
 

BIG BUG

BeitragDo, Jan 20, 2005 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke er meint alles als ein Surface. Über die UV-Koordinaten kannst Du dann die einzelnen Buchstaben aus der Textur ansprechen.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)
 

Dreamora

BeitragDo, Jan 20, 2005 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich meine 1 Surface mit 1 Textur wie Klaas es beschrieben hat.
Wozu man mehrere Surfaces nehmen sollte, verstehe ich nicht ganz, ausser man will das System vorsätzlich langsam machen Smile
denke kaum das jemand mehr als 32000 buchstaben auf den Bildschirm bekommt und soweit reicht 1 Surface Wink
Das hast du bei einer Bitmapfont auch nicht, da nimmst du ja auch nur 1 Bild und zeichnest nur Teile davon.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Ayman

BeitragDo, Jan 20, 2005 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich danke euch zunächst für eure Hilfe!

Aber mit den letzten drei Anmerkungen habt ihr mich wieder abgehängt Sad

Wenn ich nur eine Surface in meinem "TextArea"-Mesh habe, dann heißt das doch, dass ich auch nur eine Textur darauf darstelle. Also müsste ich doch die für den Text benötigten Buchstaben auf diese eine Textur draufkopieren und das würde wieder auf CopyRect-Orgien hinauslaufen ... ne, das könnt ihr nicht gemeint haben. Confused

Ihr sprecht ja von Mapping-Koordinaten (UV). Aber mein Verständnis von UV-Koordinaten reicht so weit, dass man damit die Position und Skalierung einer Textur auf einer Surface setzen kann ... bzw. Idea VertexTexCoords ... ok, ich kann also für jeden Vertex UV-Koordinaten setzen Very Happy.

Demnach hat mein Mesh also nur eine Surface und damit auch nur eine Textur, aber für jeden Character ein Quad mit Vertex-UV-Koordinaten, die einen Character aus der Textur auswählen. Whouw!

Meint ihr das? Please copy.

Ayman

Ayman

BeitragDo, Jan 20, 2005 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Das würde bedeuten, dass ich bei jeder Textausgabe die UV-Koordinaten der Vertices der beteiligten Quads ändern müsste?
 

Klaas

BeitragDo, Jan 20, 2005 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
.... vollkommen korrekt Very Happy

du grenzt mit den UV Koordinaten den Texturbereich deines Quads ein sodas nur der entsprechende Buchstabe angezeigt wird.

Zitat:

Das würde bedeuten, dass ich bei jeder Textausgabe die UV-Koordinaten der Vertices der beteiligten Quads ändern müsste?


ja, aber das geht sehr schnell
 

Gombolo

BeitragDo, Jan 20, 2005 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Moderne Grafikarten benutzen die alten DirectDrawSurfacen nicht mehr. Diese werden durch 3D Funktionen emuliert. Was wieder Zeit kostet. Was glaubt ihr warum es ab DirectX8 kein DirectDraw mehr gibt.

Wenn möglich verwende gleich 3D Funktionen. Diese sind mit Sicherheit schneller und auch noch Hardwarebeschleunigt.

Man sollte es auch vermeiden Direct3D mit DirectDraw zu mischen. Also auf eine 3D Szene mit DirectDraw Methoden etwas Zeichnen.

Die Text Funktion von B3D verwendent sicher die GDI. Diese ist zwar mit WindowsXP optimiert worden, aber ich bezweifle das es schneller ist als eine eigene (gut) programmiert die B3D Sprites verwendet.
Heute ist der erste Tag vom Rest deines Lebens
http://gombolo.go.funpic.de/

Ayman

BeitragFr, Jan 21, 2005 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank an Dreamora, Klaas & BIG BUG und die anderen Exclamation

Die Lib läuft jetzt bei mir (war ne lange Nacht) und die Speed ist - Dreamoras Post hat's angedeutet - wie 'ne Rakete: um den Faktor 10 schneller als "Text" Very Happy

Ich hab 'ne Menge über die Texturierung von Meshes dabei gelernt. Werde diese Methode bei anderen graphischen Displays wiederverwenden, zumal variable Größe, unabhängig von der Bildschirmauflösung, und Transparenz damit möglich werden.

Jetzt knödel ich nur noch über der richtigen Entfernung und richtige Position dieses Meshes ... aber das wird sich finden, da bin ich mir sicher.

P.S.
Meint ihr, ich soll die Lib im Codearchiv posten? Da ich mit 'nem Kumpel als Melbourne (Australien) zusammen progge, hab ich sie auf Englisch dokumentiert ... allerdings exzessiv Smile

P.P.S.
Drei Kuchen gehen in den nächsten Tagen auf Reisen Wink

Ayman

BeitragFr, Jan 21, 2005 23:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Wen's interessiert, ich hab ein kleines Packet mit der fertigen Lib geschnürt: LibBMPFont3D

Grüße
Ayman
 

Jake

BeitragSa, Jan 22, 2005 0:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Zum Thema "2D"-Meshes positionieren gibt es ein paar Tricks, um das Ergebnis ohne Blur-Effekt darzustellen, also möglichst scharf.

Möglich, daß du hier im Forum auch was zu findest (hab noch nicht danach gesucht), aber auf jeden Fall findest du auf Blitzcoder.com ne ganze Menge, Suchwort: "pixelperfect".
 

Jake

BeitragSa, Jan 22, 2005 0:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Zum Thema "2D"-Meshes positionieren gibt es ein paar Tricks, um das Ergebnis ohne Blur-Effekt darzustellen, also möglichst scharf.

Möglich, daß du hier im Forum auch was zu findest (hab noch nicht danach gesucht), aber auf jeden Fall findest du auf Blitzcoder.com ne ganze Menge, Suchwort: "pixelperfect".
 

Jake

BeitragSa, Jan 22, 2005 0:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Zum Thema "2D"-Meshes positionieren gibt es ein paar Tricks, um das Ergebnis ohne Blur-Effekt darzustellen, also möglichst scharf.

Möglich, daß du hier im Forum auch was zu findest (hab noch nicht danach gesucht), aber auf jeden Fall findest du auf Blitzcoder.com ne ganze Menge, Suchwort: "pixelperfect".

Ayman

BeitragSa, Jan 22, 2005 0:43
Antworten mit Zitat
Benutzer-Profile anzeigen
äh ..., Jake, Du kannst jetzt aufhören. Es kam an Wink

Vielen Dank für den Tipp, aber ich bin wohl zu blöde das Feld für die Suche auf dieser Seite zu finden. Da bringt mir das Stichwort wenig.
 

konstantin

BeitragSa, Jan 22, 2005 0:46
Antworten mit Zitat
Benutzer-Profile anzeigen
das lag definitiv nicht an jake. habe das gleiche schon im off topic beobachtet. wird mit dem umzug auf einen anderen server zu tun haben imho
 

Jake

BeitragSa, Jan 22, 2005 12:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Raaah, was ist denn da passiert.

Ich hatte beim Klick auf "Absenden" einen DB-Error bekommen, und gedacht, es sei nicht angekommen. Deshalb mittels Copy&Paste noch 2x probiert.

Sorry!

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group