LibBMPFont3D :: Superschnelle Textausgabe in Blitz3D

Übersicht BlitzBasic Codearchiv

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Ayman

Betreff: LibBMPFont3D :: Superschnelle Textausgabe in Blitz3D

BeitragSa, Jan 22, 2005 0:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi zusammen,

ja, es gab hier schon ein paar Postings zum Thema BMP-Font, aber soweit ich das nachgelesen habe, betreffen diese ausschließlich die 2D-Variante. Diese ist für Blitz3D-User jedoch wenig nützlich, da noch langsamer als der BlitzBasic/Blitz3D beiliegende "Text"-Befehl.

Das liegt bei meiner LibBMPFont3D anders. Sie läd den Font als Textur, und mappt ihn auf ein Mesh (mit einer einzigen Surface), welches für jedes Zeichen ein Quad bereithält. Jede Textausgabe führt dann dazu, dass die Texturkoordinaten (UV) aller beteiligten Vertices so verändert werden, dass die Quads wieder die richtigen Zeichen darstellen. Auf meinem Rechner ist dieses Verfahren (bei abgeschaltetem Debugger) 10 mal schneller als der "Text"-Befehl.

Ich möchte mich ausdrücklich bei Dreamora, Klaas und BIG BUG für ihre Hilfe bei dieser Lib bedanken! Die drei brauchen sie gewiss nicht mehr, aber sicherlich gibt es den einen oder anderen, dem ich damit eine Freude machen kann.

Da ich diese Library in einem Spiel einsetzen möchte, dass ich zusammen mit einem Australier entwickle, habe ich die Lib komplett auf Englisch dokumentiert. Wenn jemand damit Probleme hat, kann er mich fragen.

LibBMPFont3D ist ein ZIP-Archiv mit der Lib, zwei von mir erstellten Bitmap-Fonts, sowie einem Benchmark und einem Positionierungstool.

Grüße
Ayman

EDIT: Die Lib ist nicht 10 mal schneller, sondern _ungefähr_ bei dynamischen Texten ca. 40% und bei statischen Texten braucht der Blitz3D eigene "Text"-Befehl immerhin 4 mal so lang. Das ganze variiert aber in Abhängigkeit von der verwendeten GFX-Karte, deren Treibern und der DirectX-Version.
  • Zuletzt bearbeitet von Ayman am Sa, Jan 22, 2005 19:47, insgesamt 4-mal bearbeitet

Mr.Keks

BeitragSa, Jan 22, 2005 9:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mir das mal eben angesehen, weil das von dir beschriebene Benchmarkergebnis meine eigene 3dTextlib deutlich übertraf.
Leider ist das Ergebnis nicht aussagekräftig, da es beim 3d-Text den entscheidenden Teil, das Rendern nicht berücksichtigt... Der Renderprozess wird nämlich durch den 3dText verlängert und das ist das Entscheidende, was 3dText langsamer als Text macht!
MrKeks.net

hamZta

Administrator

Betreff: Jo

BeitragSa, Jan 22, 2005 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Muss Inarie zustimmen, hab mal renderworld in die schleife getan, najo, schreckliches ergebnis Wink
text hat 4 sekunden gebraucht, dein 3d teil 10 sekunden...
Blog.

Ayman

BeitragSa, Jan 22, 2005 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Leider ist das Ergebnis nicht aussagekräftig, da es beim 3d-Text den entscheidenden Teil, das Rendern nicht berücksichtigt

Ihr habt recht, das hatte ich nicht bedacht.

Ich habe den Benchmark nun komplett überarbeitet. "BF3D_Text" ist demnach immer noch deutlich schneller als "Text", jedoch nicht mehr 10fach. Auf meinem Rechner braucht "Text" ca. 164% der Zeit, die "BF3D_Text" benötigt.

Bitte testet den neuen Benchmark bei euch und spart nicht mit Kritik.

Code: [AUSKLAPPEN]

; benchmark.bb
; V0.2, 2005/01/22, Ayman
; Benchmark for LibBMPFont3d.bb
;

Include "LibBMPFont3d.bb"

Const foxDogText$ = "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG."
Const cycles% = 2000

Global bmpFont.BF3D_TFont
Global textArea.BF3D_TTextArea

Graphics3D 1024,768

cam = CreateCamera ()


; init 2D-TTF-Font -------------------------------------------------------------------
Color 255, 255, 255
SetFont LoadFont ("Arial", 20, True)

SetBuffer FrontBuffer()
t% = MilliSecs()
Text 10, 740, "*** Please deactivate Debug-Mode! ***"
Text 10, 10, "Starting benchmark... "
Text 10, 40, "Now trying "+30*cycles+" times 'Text'-output. Please wait."




; Benchmark #1 (2D-TTF)---------------------------------------------------------------
t% = MilliSecs()
For i = 1 To cycles

   For j = 70 To 650 Step 20
      Text 10, j, foxDogText
   Next
Next
t2% = MilliSecs()-t



; init BitmapFont --------------------------------------------------------------------
;bmpFont = BF3D_LoadFont ("wide8-128.png")
bmpFont = BF3D_LoadFont ("wide16-256.png")
textArea = BF3D_CreateTextArea (bmpFont, 44, 30, cam, $80FF80)      ; 44 == Len (foxDogText$)

BF3D_Text textArea, 0, 0, "Now trying "+30*cycles+" times 'BF3D_Text'-output."
BF3D_Text textArea, 0, 1, 30*cycles + " 'Text'-outputs took "+ t2 + " millisecs."
RenderWorld
Flip


; Benchmark #2 (LibBMPFont3d)---------------------------------------------------------
t% = MilliSecs()
For i = 1 To cycles

   For j = 0 To 29 Step 1
      BF3D_Text textArea, 0, j, foxDogText
   Next

   RenderWorld
Next
t3% = MilliSecs()-t




Flip
SetBuffer FrontBuffer()
Text 10, 720, 30*cycles + " 'Text'-outputs took "+ t2 + " milliseconds."
Text 10, 740, 30*cycles + " 'BF3D_Text'-outputs took "+ t3 + " milliseconds."


WaitKey()

End


Grüße
Ayman

Ayman

BeitragSa, Jan 22, 2005 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
@Inarie:
Um wieviel ist deine Lib schneller als "Text"?
Verwendet deine Lib auch Quads für jedes Zeichen?

Ayman

BeitragSa, Jan 22, 2005 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Es versteht sich von selbst, dass meine Lib bei statischem Text noch einmal deutlich schneller ist.

Verlagere ich die Schleife zur Texterzeugung vor die RenderWorld-Schleife, ...
Code: [AUSKLAPPEN]

; Benchmark #2 (LibBMPFont3d)---------------------------------------------------------
t% = MilliSecs()

For j = 0 To 29 Step 1
   BF3D_Text textArea, 0, j, foxDogText
Next

For i = 1 To cycles
   RenderWorld
Next
t3% = MilliSecs()-t

... dann ist "BF3D_Text" vier mal schneller als "Text".

Aber ich denke der Benchmark oben (v0.2) ist fair.
 

Edlothiol

BeitragSa, Jan 22, 2005 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir ist Text schneller mit ca 12500 zu 15000 Millisekunden.

Geforce2
DX9.0b
  • Zuletzt bearbeitet von Edlothiol am Sa, Jan 22, 2005 18:48, insgesamt einmal bearbeitet

Bigmichi

BeitragSa, Jan 22, 2005 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
bei mri hat der text 20 sek
und deine lib 5 sek gebraucht

DX 9.0C
9800 Pro
  • Zuletzt bearbeitet von Bigmichi am Sa, Jan 22, 2005 17:55, insgesamt einmal bearbeitet

Ayman

BeitragSa, Jan 22, 2005 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Seid so lieb und schreibt, welche Grafikkarte und welche DirectX-Version ihr nutzt.

Mr.Keks

BeitragSa, Jan 22, 2005 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ayman hat Folgendes geschrieben:
@Inarie:
Um wieviel ist deine Lib schneller als "Text"?
Verwendet deine Lib auch Quads für jedes Zeichen?
ja, sie ist technisch eigentlich ähnlich. daher habe ich mir deine auch mal von deinem benchmarkergenis überrascht angesehen. ich habe meine nie direkt mit text verglichen, aber sie erschien mir nicht so viel schneller als text.

edit: habe gerade deinen code gelesen. hehe, diese "tileengine" mag zwar speed beim texterstellen bringen, doch ist sie ziemlich unflexibel... kann das sein?
edit2: ich habe jetzt mal auch meine minilib auf geschwindigkeit getestet. sie ist tatsächlich auch schneller als text, aber etwas langsamer als deine. dafür hat sie aber echte vorteile gegenüber text, da die texte frei positionierbar, skalierbar, blendbar, fadebar und drehbar sind. sie werden als einzelne entities berechnet und nicht auf ein vorgefertigtes singleentite-gitter gepappt.
MrKeks.net

Ayman

BeitragSa, Jan 22, 2005 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
@Inarie:Zitat:
edit: habe gerade deinen code gelesen. hehe, diese "tileengine" mag zwar speed beim texterstellen bringen, doch ist sie ziemlich unflexibel... kann das sein?
Was meinst du mit unflexibel?

Zitat:
edit2: ich habe jetzt mal auch meine minilib auf geschwindigkeit getestet. sie ist tatsächlich auch schneller als text, aber etwas langsamer als deine. dafür hat sie aber echte vorteile gegenüber text, da die texte frei positionierbar, skalierbar, blendbar, fadebar und drehbar sind. sie werden als einzelne entities berechnet und nicht auf ein vorgefertigtes singleentite-gitter gepappt.


Das mit dem "frei positionierbar, skalierbar, blendbar, fadebar und drehbar" ist derzeit bei mir noch nicht hinreichend implementiert. Das sehe ich auch so. Immerhin ist es kein Problem Farbe oder Alpha zu setzen. Aber bei mir sind Skalierung, Drehung und Positionierung noch nicht gut an 2D-Text-Bedürfnisse angepasst. Das wird eine nächste Version bringen müssen.

Ich verstehe aber nicht, was du mit folgender Unterscheidung meinst: Zitat:
sie werden als einzelne entities berechnet und nicht auf ein vorgefertigtes singleentite-gitter gepappt.
Question

Sehe ich das richtig, dass bei dir jedes Zeichen ein extra Entity und somit eine extra Surface darstellt? Verwendest du dabei _eine einzelne_ Textur für den gesamten Font (und mappst sie wie ich nur über VertexTextureCoords) oder hast du für jedes Zeichen eine extra Textur, die Du dann einem Char-Entity zuweist?

Der Geschwindigkeitsvorteil meiner Lib liegt wahrscheinlich darin begründet, dass ich mit _einer_ Surface und _einer_ Textur für ein komplettes Textarea auskomme.

Grüße
Ayman

Phalastos

BeitragSa, Jan 22, 2005 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
DirectX 9c , ATI 9100 64 MB DDR, AMD 2200+, 256 MB RAM

Text 14510 ms
3dlib 9820 ms
Forbiddenmagic - Warfare of Forgotten Power

Mr.Keks

BeitragSa, Jan 22, 2005 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm... also:
ich benutze für jedes zeichen ein quad, das baustein eines singlesurfacemeshes ist. jedoch hat jeder text ein eigenes mesh.

ich zeichne es...
http://www.inarie.de/sonstiges/texte.gif
da siehst du: ich erstelle für einzelne textbausteine eigene entities (rote umrandung), während du ein großes feld erstellst und dann dort die texte reinpappst. deins ist beim erstellen neuer texte deutlich schneller, da nicht ein neues mesh erstellt werden muss, sondern direkt die uvcoords im textarea abgeändert werden.

bei dir muss jedoch ein komplett neues textarea führ drehung, rasterlose positionierung und so weiter erstellt werden. das in einzelne entities aufsplitten hat auch den vorteil, dass man für text-positionierung usw. einfach die blitz3d-entity-befehle nutzen kann.

mal das herz meiner minilib... ohne spielereien, nennen wir es light:
wer möchte, kann das ganze mit dieser lustigen schriftart ausprobieren:
http://www.inarie.de/sonstiges/font2.png
Code: [AUSKLAPPEN]
Type txt_font
   Field tex
   Field width#,height#
End Type


Const txt_width# = 1/94.0

Function Txt_LoadFont(fontp$,mode,width#,height#)
   f.txt_font   = New txt_font
   f\tex      = LoadTexture(fontp$,mode)
   f\width      = width
   f\height   = height
   
   Return f\tex
End Function

Function Txt_Text(txt$, font, par=0, align=0)
   For f.txt_font = Each txt_font
      If f\tex = font Then Exit
   Next
   
   mesh = CreateMesh(par)
   sur = CreateSurface(mesh)
   
   Local vert[3]
   
   x# = Len(txt) * f\width * align
   
   For i = 1 To Len(txt$)
      Ascii = Asc(Mid(txt$,i,1))
      
      If ascii = 32
         vert[0] = AddVertex(sur, x#,f\height,0,         0,0) ; ol
         vert[1] = AddVertex(sur, x#,0,0,            0,0) ; ul
         vert[2] = AddVertex(sur, x#+f\width,f\height,0,   0,0) ; or
         vert[3] = AddVertex(sur, x#+f\width,0,0,      0,0) ; ur
      Else
         ascii = ascii-33
         u# = ascii * txt_width   +.001
         
         vert[0] = AddVertex(sur, x#,f\height,0,         u#,.05) ; ol
         vert[1] = AddVertex(sur, x#,0,0,            u#,1) ; ul
         vert[2] = AddVertex(sur, x#+f\width,f\height,0,   u#+txt_width*.9,.05) ; or
         vert[3] = AddVertex(sur, x#+f\width,0,0,      u#+txt_width*.9,1) ; ur
      EndIf
      
      AddTriangle(sur,vert[2],vert[1],vert[0])
      AddTriangle(sur,vert[1],vert[2],vert[3])
      
      x# = x# + f\width#
   Next
   
   EntityTexture mesh,f\tex
   
   Return mesh
End Function
MrKeks.net

Shadow of the night

BeitragSo, Jan 23, 2005 13:04
Antworten mit Zitat
Benutzer-Profile anzeigen
DirectX 9c, GeForce 4 Ti 4800 Se, 128 MB DDR, Pentium 4 3,06 GHZ, 512 MB RAM

Text: 27'884 ms
3dlib: 3'551 ms
User posted image

Ayman

BeitragSo, Jan 23, 2005 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
@Shadow of the night:Zitat:
DirectX 9c, GeForce 4 Ti 4800 Se, 128 MB DDR, Pentium 4 3,06 GHZ, 512 MB RAM

Text: 27'884 ms
3dlib: 3'551 ms

Very Happy Du machst mir Mut. Ich wollt ich könnte solche Werte auf meinem Steinzeitsystem erreichen ...

Ich bin dabei die Lib benutzerfreundlicher bezüglich Positionierung und Skalierung des Textes zu machen. In den nächsten Tagen poste ich die überarbeitete Version.

Noch 'ne Frage: Hat jemand eine Lib mit einer noch schnelleren Textausgabe? Wäre für mein Ego wichtig zu wissen Wink

Grüße
Ayman
 

Gombolo

BeitragMo, Jan 24, 2005 1:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Um dir mehr Mut zu machen Very Happy

Text :18123 ms
3dlib :2918 ms

SYSTEM: P4 3.06GHz | 1024MB | Radeon9600Pro
Heute ist der erste Tag vom Rest deines Lebens
http://gombolo.go.funpic.de/

Jan_

Ehemaliger Admin

BeitragMo, Jan 24, 2005 10:34
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, TXT ~ 8000
deins ~ 2500
bei 6000

Aber, deins habe ich nciht gesehen, nur das TXT
schade. Ist das so geadcht, das man nichts sieht?

PC: P3: 600 MHZ
Matrox Millenium 200 (8MB Ram)
392 MB Ram
between angels and insects

eleXity

ehemals "BlackProgrammer"

BeitragMo, Jan 24, 2005 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
hi

mal von mir
Text :11208 ms
3dlib :1983 ms

AMD 64 3200+
Radeon X800 XT
1024 MB RAM
nVidia 570GTX | AMD Phenom II X6 | 8 GB RAM | 1TB | Win 7 Ultimate 64 SP1 | B3D, BMAX, BP, C#

Projekt : Worklog

Ayman

BeitragMo, Jan 24, 2005 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
@Jan_:
Zitat:
hm, TXT ~ 8000
deins ~ 2500
bei 6000

Mit TXT meinst du den "Text"-Befehl?
Was hat die 6000 zu bedeuten?
Zitat:
Aber, deins habe ich nciht gesehen, nur das TXT
schade. Ist das so geadcht, das man nichts sieht?

Äh ... du solltest schon was sehen ... zumindest wenn Deine Matrox-Karte _eine_ Textur mit einem Kantenmaß von 256x256 Pixeln verarbeiten kann und das war glaube ich seit den Zeiten von DirectX Version 3 üblich ...

Was passiert denn nach der 'Text'-Darstellung bei dir auf dem Schirm? Bleibt der dann 2,5 Sekunden lang schwarz oder was?

Grüße
Ayman


P.S. Vielen Dank für Eure fortlaufenden Benchmarks !!!

Ich bin ziemlich platt, wie eure neueren Grafikkarten abgehen. Man merkt, dass vor allem die 3D-Performance angestiegen ist. Meine ganz oben in 'EDIT' angefügte Bewertung von einer 40% Geschwindigkeitsüberlegenheit meiner Lib basiert auf Messungen mit meinem System (GF2-MX400, P3-800, _keinerlei_ DDR-RAMs).
  • Zuletzt bearbeitet von Ayman am Mo, Jan 24, 2005 19:09, insgesamt einmal bearbeitet
 

David

BeitragMo, Jan 24, 2005 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Zitat:

Text: 11237
3DLib: 4342

AMD Athlon XP 2600+
512 MB Ram
GeForce 6800GT 256


Zitat:

Text: 15014
3DLib: 26498

Intel PIII 600
128 MB RAM
GeForce4 MX 440


Zitat:

Text: 12230
3DLib: 7314

AMD Athlon XP 2400+
512 MB RAM
GeForce FX 5200


grüße
  • Zuletzt bearbeitet von David am Mo, Jan 24, 2005 19:14, insgesamt einmal bearbeitet

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group