LibBMPFont3D :: Superschnelle Textausgabe in Blitz3D
Übersicht BlitzBasic Codearchiv
AymanBetreff: LibBMPFont3D :: Superschnelle Textausgabe in Blitz3D |
Sa, Jan 22, 2005 0:02 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Jan 22, 2005 9:39 Antworten mit Zitat |
|
---|---|---|
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 |
hamZtaAdministratorBetreff: Jo |
Sa, Jan 22, 2005 14:20 Antworten mit Zitat |
|
---|---|---|
Muss Inarie zustimmen, hab mal renderworld in die schleife getan, najo, schreckliches ergebnis
text hat 4 sekunden gebraucht, dein 3d teil 10 sekunden... |
||
Blog. |
Ayman |
Sa, Jan 22, 2005 16:35 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Jan 22, 2005 16:43 Antworten mit Zitat |
|
---|---|---|
@Inarie:
Um wieviel ist deine Lib schneller als "Text"? Verwendet deine Lib auch Quads für jedes Zeichen? |
||
Ayman |
Sa, Jan 22, 2005 16:53 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Jan 22, 2005 16:55 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Jan 22, 2005 17:03 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Jan 22, 2005 17:12 Antworten mit Zitat |
|
---|---|---|
Seid so lieb und schreibt, welche Grafikkarte und welche DirectX-Version ihr nutzt. | ||
Mr.Keks |
Sa, Jan 22, 2005 17:22 Antworten mit Zitat |
|
---|---|---|
Ayman hat Folgendes geschrieben: @Inarie:
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.
Um wieviel ist deine Lib schneller als "Text"? Verwendet deine Lib auch Quads für jedes Zeichen? 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 |
Sa, Jan 22, 2005 19:26 Antworten mit Zitat |
|
---|---|---|
@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.
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 |
Sa, Jan 22, 2005 20:02 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Jan 22, 2005 21:21 Antworten mit Zitat |
|
---|---|---|
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 |
So, Jan 23, 2005 13:04 Antworten mit 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 |
||
User posted image |
Ayman |
So, Jan 23, 2005 16:41 Antworten mit Zitat |
|
---|---|---|
@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 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 Grüße Ayman |
||
Gombolo |
Mo, Jan 24, 2005 1:58 Antworten mit Zitat |
|
---|---|---|
Um dir mehr Mut zu machen
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 |
Mo, Jan 24, 2005 10:34 Antworten mit Zitat |
|
---|---|---|
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 |
eleXityehemals "BlackProgrammer" |
Mo, Jan 24, 2005 15:42 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Jan 24, 2005 18:48 Antworten mit Zitat |
|
---|---|---|
@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 |
Mo, Jan 24, 2005 18:59 Antworten mit Zitat |
|
---|---|---|
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
Übersicht BlitzBasic Codearchiv
Powered by phpBB © 2001 - 2006, phpBB Group