Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

17.05.2010, 00:11

Hmm, und dadurch das du die Dreiecke etc alles cullst bzw so anpasst das niemals 2 Pixel übereiander liegen, ist es auch wurscht in welcher reihenfolge du renderst. Nur blöd ist dann ja, das man bei jedem male wenn sich was in der Szene ändert, z.b. man einen neuen buffer erstellt, dass man wieder einen neuen Buffer erstellen muss und ihn wieder komplett mit den Daten füttern muss.

Darf ich mal eine Demo von dir haben, welche du mit GUI Elementen voll gestopft hast? würde mal gern sehen wie das läuft, ob es schnell genug ist etc.

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

12

17.05.2010, 00:49

Schnell genug ist es allemal, selbst bei 5-6 Fenstern mit massig Buttons & Co. liege ich hier auf meinem Mitteklasse-PC bei 1920x1280 immer noch weit jenseits der 1000 FPS.
Problematisch finde ich eigentlich nur Text, da ist es zwar immer noch angenehm bedienbar, aber man merkt schon, dass es ihm weh tut, wenn man mal die EULA mit 50 Zeilen à 80 Zeichen auf einmal anzeigt oder ähnliches. Aber bei allem anderen wie Buttons, Fenster & Co. die halt maximal aus 20-30 Grafiken bestehen... wie gesagt, nicht der Rede wert.

Ansonsten siehe PM. :-)

LG
Alyx

13

17.05.2010, 01:53

4000 Quads, sowas ist niemals gut!^^

Da muss man ja schon an Quadtrees etc denken. Aber tut sich die Windoof API dabei nicht genauso schwer? Wenn ich Notepad vollstopfe mit Buchstaben dauaert der Seitenaufbau beim Scrollen auch seine Zeit.
Zumindest bei XP war das noch so, bei Vista läuft das ganze ja sehr flott, aber da soll ja die Oberfläche mit DX10 gerendert werden, so wie ich das verstanden habe.

Was ich mich aber grad frage ist, wie du die Transparenz hinbekommen hast? Also bei dir liegen ja niemals 2 Dreiecke übereinander, wie kommt es dann dass du runde Ecken hast? müsste da dann nichst sowas wie nen schwarzes loch entstehen, also dass an den Ecken einfach nen Bereich ist wo "Nichts" gerendert wird?

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Potatoman« (17.05.2010, 02:16)


Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

14

17.05.2010, 14:24

Naja 4000 Quads, sprich 8000 Dreiecke, sind sicherlich nicht das Problem, das Problem ist dann mehr das Handling an sich bzgl. automatischen Zeilenumbruechen etc. pp., aber dem könnte man mit Caching von bestimmten Infos sicherlich gegenan wirken, werde ich wohl irgendwann auch nochmal tun.

Wegen den runden Ecken:
Jede Komponente hat eine GetCoverageRects-Funktion, im Falle des Fensters liefert die den Bereich zwischen den Runden Ecken oben links und unten rechts sowie den, der von der Caption verdeckt wird. Beim Zeichnen schaut jede Komponente dann, welche Coverage-Rects sich auf sie auswirken und kann entweder gleich selbst darauf reagieren, ansonsten tut es das Canvas bei Funktionen à la FillRect, FadeRect etc. pp., so dass halt möglichst wenig doppelt und dreifach übermalt wird.

So genau muss es auch gar nicht sein, lohnen tut es auch wie gesagt erst ab größeren Flächen a la 100x100, aber zumindest grob sollte man das abfangen, da es halt sinnfrei ist erst den kompletten Desktop zu füllen, vor dem dann eh ein maximiertes Fenster ist. Und es wirkt sich ziemlich stark aus, als ich es damals eingebaut habe, sprang die Framerate schlagartig von 750 auf 1900... im 2D-Bereich ist was die Performance anbelangt Füllrate da wirklich alles.

LG
Alyx

15

18.05.2010, 05:03

Mir ist da grad mal sone kleine Idee gekommen. Wie wäre es denn, wenn man jedes "Fenster" in einen eigenen Backbuffer rendert. Dabei werden die ganzen Controlls die ein Fenster als Children hat auch in deren Backbuffer gerendert. Also dann im prinziep ein Backbuffer in dem das Fenster selbst und deren Controlls wie Buttons etc drin sind. Anschließend rendert man die ganzen Backbuffer einfach in den HauptBackbuffer und Flipt es auf den Bildschirm. Der Vorteil wäre dann ja, das man nur das neu rendern muss, wo sich auch tatsächlich etwas verändert hat. Man hat zwar viel mehr Api Calls, dafür aber wird man kaum noch was rendern müssen.

Ich stelle mir das auch grd mal in nem Spiel vor. In 99% der Zeit die man am Spielen ist sieht die Gui immer gleich aus. Soll man nun mit jeder Frame den ganzen Kram neu rendern, oder dann doch lieber einmal alles in einen Backbuffer, und dann einfach den Backbuffer drüber kippen?

Beim rendern würde ich dann in etwa so vorgehen:
- Render das Fenster1 selbst und danach alle Controlls die in diesem Fenster1 sind in den Backbuffer des Fensters1
- Render alle Fenster im Fenster2 (also auch Fenster 1) in den Backbuffer des Fenster2.
- usw ...
- Render die Fenster die kein parent Fenster haben in den Backbuffer der GUI
- Render den GUI Backbuffer in den Haup-Backbuffer

Beim ersten Rendern würde das ganze dann schon recht lange dauern. Danach jedoch würde das ganze kaum noch Zeit in anspruch nehmen. Beispielsweise ich verschiebe Fenster1. An Fenster 1 tut sich nichts mehr, der Backbuffer wird einfach beibehalten. Der Backbuffer wird dann einfach in den Backbuffer von Fenster2 gerendert. Der Backbuffer von Fenster 2 wird einfach in den Backbuffer der GUI gerendert. Der GUI Backbuffer wird in den Haupt-Backbuffer gerendert.

Nun frage ich mich jedoch ob das denn wirklich so sinvoll ist. Ich mein, ich werde da bestimmt auf 10 RenderTargets kommen, und dann immer schön durch und durch zu rendern, ich weiß halt net :/

Ich habe zwar noch nie wirklich viel mit der WinApi gemacht, außer vllt ein paar Fenster erstellt mit Buttons und Comboboxen, aber baut nicht Windows selbst auf ein ähnliches prinziep auf. Ich mein, dort hat jedes Fenster ja auch einen "Context" in dem die ganzen Controlls gezeichnet werden?

Habt ihr was dagegen wenn ich nen neues Thema aufmache, denn das verfehlt ja grad nen wenig die Überschrift^^

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Potatoman« (18.05.2010, 06:10)


16

18.05.2010, 09:30

Zitat

Ich stelle mir das auch grd mal in nem Spiel vor. In 99% der Zeit die man am Spielen ist sieht die Gui immer gleich aus. Soll man nun mit jeder Frame den ganzen Kram neu rendern, oder dann doch lieber einmal alles in einen Backbuffer, und dann einfach den Backbuffer drüber kippen?
Das würde sowieso nicht passieren, da du ja noch Message Handling mit einbauen solltest. Und ums neu zeichnen wirst du nicht so einfach herumkommen, denn was ist, wenn z.B. ein Fenster verschoben wird? Du müsstest den aktuellen Backbuffer speichern, diesen neu zeichnen und dann die aktuelle GUI drüberzeichnen. Das wäre zumindest schneller, als z.B. im Hintergrund eine 3D Szene erneut berechnen zu lassen. Oder du benutzt eine Art transparenten Layer, den du jedes Mal problemlos clearen kannst ohne, dass der Backbuffer davon betroffen ist. Und was ist mit den Controls? Wenn z.B. ein Button gedrückt wird, muss dieser doch auch neu gerendert werden!? Man könnte jetzt wieder die gesamte GUI neu rendern, aber ich denke da wäre es die einfachste Methode einfach ein schwarzes Quadrat über den alten Button zu zeichnen und den neuen Button drüber zu zeichnen. Eine GUI ist ein sehr komplexes Thema und so ohne weiteres wird es nicht ganz so einfach mal eben eine GUI zu schreiben. Ich rate dir mal ein wenig zu googeln oder dir Bücher zu kaufen. Alternativ könnte Source Code lesen auch nicht schaden. Ansonsten kenne ich noch dieses Tutorial von damals: Klick
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

Tobiking

1x Rätselkönig

  • Private Nachricht senden

17

18.05.2010, 10:26

Die Idee kenne ich eigentlich nur um eine 2D Gui in einer 3D Anwendung weiter zu nutzen. Das Fenster wird von der 2D GUI in eine Textur gemalt und die wird dann einfach auf ein Quad der entsprechenden Größe gesetzt. Die 2D GUI bringt in der Regel auch die nötigen Funktionen mit um zu erkennen das sie neugezeichnet werden muss, welche Bereiche etc. Das Verschieben der Fenster ist dabei natürlich kein Problem. Größe ändern oder Animationen können aber dafür aufwendiger werden, da die Textur immer wieder geändert oder sogar komplett neu gemalt wird.

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

18

18.05.2010, 18:56

Mir ist da grad mal sone kleine Idee gekommen. Wie wäre es denn, wenn man jedes "Fenster" in einen eigenen Backbuffer rendert. Dabei werden die ganzen Controlls die ein Fenster als Children hat auch in deren Backbuffer gerendert.
...
Die Grundidee ist schon ganz gut, beim Mac und iPhone wird das auch ungefähr so gemacht, man muss nur das Wort Backbuffer durch Textur tauschen.

Das ist für neue Grafikkarten auf jeden Fall die perfekte Lösung und ungefähr so werde ich es dann irgendwann auch mal einbauen. Das Problem ist, dass man sich nicht darauf verlassen kann, dass jeder PC das kann, mein Laptop kann genau das mangels Treibern zum Beispiel nicht, obwohl er mit einem 2.5er Core-Duo generell eigentlich gar nicht mal so veraltet ist. Entsprechend habe ich mich halt nicht darauf verlassen und es "händisch" gelöst, werde es aber ... optional... wenn eine neue GPU vorhanden ist quasi genau so machen, wie du es schon beschrieben hast.
Es dürfte auf jeden Fall extrem viel bringen, wenn man es intelligent anstellt, da sich ja immer nur ein sehr geringer Teil des Bildschirms wirklich ändert.

LG
Alyx

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

19

18.05.2010, 19:02

Größe ändern oder Animationen können aber dafür aufwendiger werden, da die Textur immer wieder geändert oder sogar komplett neu gemalt wird.
Vor allem ersteres dürfte mit eines der größten Probleme sein, letzteres könnte man z. Bsp. abfangen, in dem man nur Fenster/Panel cached, die sich im letzten Frame nicht geändert haben.

Möglichkeit 1: Bei Größenänderung Textur vergrößern/verkleinern -> Je nach Treiber gar nicht gut
Möglichkeit 2: Größenänderung z. Bsp. nur in 2^x-Schritten und beim Ausgeben nur den entsprechenden wirklich genutzten Teil blitten -> Verschwenderisch

Beides keine schöne Lösung, wobei ich persönlich eher letztere nehmen würde, da etwas Verschwendung beim System erfahrungsgemäß weniger Schaden anrichtet als exzessives Erstellen und Löschen von Handles, auf das manche Treiber gerne mit Speicherlecks oder immer stärker sinkender Performance reagieren.

LG
Alyx

20

18.05.2010, 23:41

Dachte man kann inzwischen davon ausgehen das RenderToTexture jede GraKa unterstützt :/

Jetzt bin ich nochmehr verrwirt, auf was soll ich denn nu aufsetzen. Ich habe mal in CEGUI geschaut, und die benutzen recht viele RenderTargets.

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Werbeanzeige