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
Administrator
Quellcode |
|
1 |
std::vector<Object*> objectLists[10]; |
Alter Hase
Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Das hängt genau genommen davon ab, wo Du am meisten einsparst. Diese Frage kann man nicht generell beantworten. Hast du 500 Texturen und nur 2 Blending-States, hat ein Textur-Atlas die höchste Prio. Hast Du nur 2 Texturen und 500 verschiedene Blend-States, dann solltest Du Dich um letzteres kümmern. Wie Bomml schon sagte lässt sich aber vermutlich beides machen, weil "die meisten Sachen eh mit notwendigerweise Alpha-Blending gerendert" werden.Drei Fragen hab ich allerdings noch:
- Was hat Priorität, dass gleiche Alphablending oder die gleiche Textur?
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (29.06.2012, 14:27)
Administrator
Du kannst eventuell auch versuchen, 2-dimensionale Vektoren zu umgehen und sie auf 1-dimensionale zu mappen. Zugriffsformel ist dann vVector[x+y*(Anzahl der Daten in einer Reihe)].
Wurde mir letztens empfohlen, weil es sonst unnötig kompliziert wird.
Du kannst eventuell auch versuchen, 2-dimensionale Vektoren zu umgehen und sie auf 1-dimensionale zu mappen. Zugriffsformel ist dann vVector[x+y*(Anzahl der Daten in einer Reihe)].
Wie soll ich denn deiner Meinung nach die Koordinaten gleich als Float abspeichern wenn ein Graphikobjekt voher noch garnicht weiß, wieviele Eckpunkte es hat? Wenn ich z.B. nur Dreiecke zeichne, mag das vielleicht okay sein aber bei Polygonen wird das äußerst schwierig, außer natürlich ich verzichte komplett auf diese.
Was die Geometrie angeht, ist es relativ schwierig zu beantworten, ich möchte kein starres System programmieren, sondern eins was genug Features bietet, ohne Geschwindigkeitsbußen in Kauf zu nehmen. Von daher ist mit allem zu rechen, was einigermaßen "normal" ist, d.h. Vertexpositionen, Texturpositionen, sowie Farben ändern sich regelmäßig, die Art des Blendings und die Textur an sich, sowie Ebenenposition eher selten bis garnicht.
Außerdem, geht nicht, gibts in der Regel nicht, zumindest was Programmieren angeht.
Dieser Beitrag wurde bereits 13 mal editiert, zuletzt von »dot« (29.06.2012, 15:09)
Ich seh nicht ganz den Zusammenhang. Du hast eben einfach ein Array aus Vertices, deren Koordinaten eben vom Typ float und nicht int sein sollten!? Irgendwann musst du die kennen, sonst kannst du nix zeichnen...
Wie sieht es mit der Anzahl der Vertices/Grafikobjekte aus? Ist die zumindest über viele Frames konstant, oder ändert sich die ständig? Und ändern sich wirklich potentiell alle Objekte oder ist mit einem nennenswerten Anteil statischer Objekte zu rechnen, sodass es sinnvoll sein könnte, diese extra zu handhaben? Handelt es sich großteils um einzelne, unzusammenhängende Dreiecke, oder sind vor allem eher komplexere Polygone zu erwarten, sodass es möglicherweise sinnvoll sein wird, einen Indexbuffer zu verwenden? Von wievielen Objekten pro Frame reden wir hier eigentlich überhaupt?
Aber was für den einen Anwendungsfall die effizienteste Lösung ist, ist für den anderen Anwendungsfall eine sehr ineffiziente Lösung. Ein System, das einfach alles unterstützt, ohne irgendwo dafür zu bezahlen, kann es rein prinzipiell nicht geben. Du kannst immer nur einen guten Trade-off für einen bestimmten Anwendungsfall suchen. Und wenn wir dir dabei helfen sollen, müssen wir deinen konkreten Awendungsfall kennen...
Warum sollte ich lieber float als int benutzen?
Das kommt ganz darauf an, ich möchte das ganze sowohl für RPGs, bei denen sich bekanntermaßen auf einer Map eher viele statische, zusammenhängende Objekte befinden (die einzellnen Tiles), die je nach Spielerposition entweder gezeichnet werden oder auch nicht und deren Position sich nur beim scrollen verändert, als auch für Bullet Hell Shooter, bei denen eher viele nicht zusammehängende, dynamische Objekte (die Kugeln) auf dem Bildschirm sind. Dort würden sich pro Frame natürlich alle Objekte bewegen. Es sind eher weniger komplexere Polygone zu erwaten, falls sie die Performance wirklich dermaßen bremsen, kann ich sie auch ganz rausnehmen und nur Quadrate (die in 2 Dreiecke "konvertiert" werden) und Dreiecke zeichnen. Wir reden hier mindestens von 12000 Objekten pro Frame und höchstens sind es an die 65000 (die meisten werden entweder statisch oder dynamisch sein) denke ich. Das kommt ganz darauf an, wie ich sie zeichnen lasse, wenn es sich nur um Dreicke handelt, kannst du die Anzahl nocheinmal verdoppeln, da die meisten Objekte quadratisch sein werden.
Du redest aber von einem äußerst statischem Systen. Was ist denn wenn ich einen Struct für Listen erstelle, in dem befindet sich ein Vector, welche die Graphikobjekte speichert und einige Variablen die angeben auf welcher Z Position sich das ganze befindet, hinzu kommt noch ein bool, welcher angibt ob es dynamisch oder statisch gezeichnet werden soll. Dann noch einen Vector Pointer dafür und dann jeden Frame ordnen lassen, da es nicht viele Listen sind und es sich um einen Pointer handelt, wird dabei auch nicht sonderlich viel Rechenleistung verbraten und das ganze bleibt trozdem effizient.
Dieser Beitrag wurde bereits 20 mal editiert, zuletzt von »dot« (02.07.2012, 02:46)
Werbeanzeige