Autor Beitrag
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Fr 23.05.08 08:32 
Hihu,
ich hab mal wieder ein kleines Opengl Problem.
Zur 3d Textausgabe verwende ich wglUseFontOutlines. Ich weiß, dass es nicht das schnellste ist, aber:
Ich zeichne ca. 3Mio Linien, (mittels glCallLists) was kein Problem ist, aber bei 100 Texten (ebenfalls glCallList bzw. glCallList in glCallList) sinken die Frames auf ca. 20% ab. Das kann ja nicht sein? Mit wglUseFontBitmaps hab ich keinerlei merkbaren FrameDrops (vill 1-2) obwohl der selbe Text ausgegeben wird. (Hab die halt dann nicht in 3d, brauche eigentlich nur Skalierung).

Eigentlich mach ich nur bisl Rotate, Scale und Translate und dann so 10 mal glCallLists. Was mir auffällt ist, dass bei der Liste mit den Fonts von wglUseFontOutlines der Prozessor ordentlich ausgelastet wird (der sollte eigentlich nichts machen, da der dafür nur 1x !! glCallList aufruft! Bei den 3Mio Linien hat der ne Auslastung von 0% (1x glCallList) bei dem Text ~ 50% (auch nur 1x glCallList))

Was mach ich falsch? Und wieso macht der Prozessor überhaupt was :/ Das Problem besteht auf den nvidia und matrox Grakas.

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 23.05.08 11:15 
wglUseFontOutlines erzeugt Polygone und wglUseFontBitmaps erzeugt richtige (monochrome) Bitmaps. Je nach eingestellter Qualität bei wglUseFontOutlines kommen dort pro Zeichen schon eine gewisse Menge an Polygonen zusammen. Wenn die Schrift klein genug ist, dann fällt der Qualitätsunterschied nicht mehr auf und man spart eine Menge an Zeit.

Mich persönlich würde eher mal interessieren wo du die Texte erstellst bzw wie das Resultat aussehen soll (am Besten ein Bild). Denn sowohl Polygonale Fonts als auch Bitmap Fonts sind nicht so schnell wie sie sein könnten. Wobei es da stark auf die Menge an Text ankommt.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
uall@ogc Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Fr 23.05.08 12:47 
Hab mal ein Bild angehängt.
Das Problem ist, dass ich viele Texte (nicht nur wie im Bild Zahlen) habe. Und sie schnell anzeigen muss -> vorcompiliert per glNewList. Die Texte ändern sich zur Laufzeit nicht! ggf sind alle Texte sichbar, hab jetzt nicht geschaut wieviele das sind. ABER: Warum zum Teufel wird die CPU ausgelastet?

Ich hab Spasseshalbar mal die wglUseFontOutlines ersetzt (durch eine eigene Funktion die nen Dreieck zeichnet) -> CPU wird auch belastet. Übrigens ist dies auch bei wglUseFontBitmaps der Fall.
Es kommt mir so vor als wenns nur bei Listen in Listen auftritt:

Für jeden Buchsatben erhalte ich ja eine Liste und dann erstell ich für alle Texte (ist ein Layer) nochmal eine Liste.
Das Hautpprogramm skaliert, nen bisl und ruft dann lediglich im Paint Ereigenis glCallList(layer) auf. layer besteht dann aus einer Reihe von Aufrufen mit Translatef (Positionierung) und glCallLists (Buchstaben zeichnen).

Die CPU hat damit eigentlich nichts zu tun. Denke der Treiber ist mal wieder kacke und kann net wirlkich mit Listen in Listen umgehen und macht dann mal wieder Mist.

Ich teste nochmal nen bisl.
Einloggen, um Attachments anzusehen!
_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 23.05.08 16:39 
DisplayListe können nicht vollständig auf der Grafikkarte erledigt werden. Sondern lediglich solche Dinge wie massives Zeichnen von Vertices. Beim Call von anderen Listen weiß ich nicht genau ob dort jetzt nur der Call in die andere Liste wandert oder ob die komplette ausgeführt und in die Liste gepackt wird. Aber ich denke es handelt sich dabei um blockierende Anweisung und somit muss der Treiber warten. Ich hatte mal eine Anwendung geschrieben die nur ein paar transparente Quads gezeichnet hat und die CPU Last war bei 100%. Aber wenn man die Zeiten mal in User und Kernel gesplittet hat konnte man sehen, dass über 90% der Zeit im Kernel (Treiber) waren.

Zum Thema Texte. 3D Texte sind da sicherlich die Praktischsten aber die sind immer Doppelseitig und für deinen Fall wohl fast etwas zu übertrieben. Ich hätte evtl eine Alternative für dich. Eine Bibliothek namens TextSuite die ich selber geschrieben habe und nur zum Darstellen von Text in OpenGL gedacht ist. Das sind aber Texturfonts. Also nichts weiter als texturierte Quads. Und das sollte schneller sein als bitmap oder polygonale Fonts.

Wobei ich da empfehlen würde, dass du selber überprüfst was in etwa sichtbar ist und was nicht. Du kannst nicht die ganze Welt mit einem Befehl zeichnen wollen. Selbst wenn der Treiber/Graka das alles skippt aber die Anzahl der internen OpenGL Befehle wird irgendwann schon zu viel sein.

PS: Eine Displayliste ist im übrigen nicht immer schnell. Zu mal Displaylisten mit OpenGL 3 *hust* auch irgendwann komplett entfernt werden (sowie der Imediate mode). Wenn die Objekte (ein einzelnes Quad) zu klein sind, dann ist eine Displayliste sogar noch langsamer als wie, wenn man es direkt selber mit glBegin / glEnd erledigen würde. Also die DisplayListe ist keineswegs die Wunderwaffe für alles! Aber das nur mal an Rand. Auch weil meine Fonts aktuell nur einzelne Quads zeichnen. Die aktuelle Downloadvariante ändert sogar noch die Position was mein Dev nicht mehr tut.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
uall@ogc Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Fr 23.05.08 17:00 
Hi danke erstmal. Ich behaupte jetzt eifnach mal, dass in 50% der Fälle bei mir mehr als 500k Linene gleichzeitig sichtbar sind. Desweiteren ist der Prozessor zu 80% durch HDTV komprimierung augelastet. Der Prozessor soll also nach Möglichkeit, nicht belastet werden. Da kamen für mich jetzt nur Displaylisten in Frage. Zumal die Daten in den Displaylisten nicht verändert werden. Zur Laufzeit werden natürlich noch Objekte erzeugt, die dann nur gezeichnet werden wenn sie sichbar sind.

Ich muss mal genau schauen wieviele Buchstaben gezeichnet werden usw. Deine Alternative schau ich mir aber mal an.

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit