Eure Erfahrungen mit skeletaler Animation?

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Eure Erfahrungen mit skeletaler Animation?

Beitrag von Top-OR »

Hallo Leute,

ich habe eine Frage:
Wie sind eure Erfahrungen bezüglich skeletaler Animation (bones updaten + skinning)?

Ich habe ein System, welches - momentan nur - Doom3 DM5-Modelle laden kann und diese animiert darstellt. Dabei kann es mehrere Animationen zusammenmischen.

Das Berechnen des „aktuellen“ Skelettes für einen Charakter geschieht komplett auf der CPU. Das Skinning im Anschluss auch. Geschichten wie inverse Kinematik sind nicht vorgesehen.

Nun ist das Ganze ja doch ein ziemlicher Aufwand. Um das Ganze etwas zu beschleunigen, habe ich weiterhin etwas mit Multithreading experimentiert und diese Updates() vom Show() abgekoppelt (2 Puffer).

Das Ganze läuft ganz gut, auch in einer Szene, in der 4-5 Charaktere gleichzeitig zu sehen sind + (statische Weltgeometrie). Ich denke, auf meinem aktuellen System 3GHz Core2Quad (2 Threads fürs Animieren und Skinnen) machts den Kohl auch nicht fett, wenn noch ne handvoll Charaktere dazu kommen, aber ich habe Bedenken, was größere Ansammlungen von Charakteren angeht.

Sicher kann man das Updateintervall z.B. in Abhängigkeit von der Entfernung zur Kamera etwas heruntersetzen, aber „richtig Punkte“ bringt das auch nicht.

Ich möchte diesen Prozess aus verschiedenen Gründen auch gern auf der CPU behalten und nicht auf die GPU schieben. Dies geschieht zu einen, da ich mit stencil shadows experimentiert habe und ich mit weiterhin nicht sicher bin, ob es sinnvoll ist, in einem Szenario mit möglichst vielen verschiedenen Charakteren die ganzen Geometrie-Daten auf die GPU zu schieben.

Einen genauen Benchmark muss ich noch vorbereiten, dann kann ich genauer sagen, viel Updates pro Sekunde bei welchen und wie vielen Charakteren ich schaffe.

Wie macht Ihr das? Wie löst Ihr das Problem „Monsterhorden stürmen auf euch zu“? Doch GPU? :?:

Wie gesagt, mein Problem ist nicht akut und eigentlich auch kein „Problem“, aber ich wäre für Denkanstöße dankbar. Ich bin einfach mal neugierig...

Beste Grüße
--
Verallgemeinerungen sind IMMER falsch.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Eure Erfahrungen mit skeletaler Animation?

Beitrag von Aramis »

Wenn du das Skinning auf der GPU durchfuehrst, kannst du von Instancing profitieren, denn bei Monsterhorden zeichnest du ja letztlich immer dasselbe nur mit jeweils unterschiedlichen Bonematrizen. Ich bezweifle, dass Spiele wie Left4Dead moeglich waeren ohne GPU-Skinning.

Skinning auf der CPU erfordert ja einen staendigen Re-Transfer der Vertices zur GPU. Damit wird die maximale Zahl an animierten Modellen im wesentlichen durch den Transfer zur Grafikkarte beschraenkt (das bisschen Skinning belastet ja die CPU nicht wirklich … zumal es, wie du schon sagtest, problemlos parallelisierbar ist). Du musst halt insbesondere gucken, was du sonst noch regelmaessig hochladen musst damit du dein Bandbreitenkonto nicht ueberziehst.

Stencil-Shadows sind meines Wissens uebrigens ziemlich out.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4859
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Eure Erfahrungen mit skeletaler Animation?

Beitrag von Schrompf »

Stencil Shadows kann man mit DX10 und Geometrie-Shadern auch auf der GPU machen. Das bringt schon ein paar Punkte, um die CPU zu entlasten. Ob das noch ins Gewicht fällt, wenn man einen Core übrig hat und den Job sauber auslagern kann, ist die andere Frage. Ich stimme Aramis aber ansonsten zu: Stencil Shadows sind out. Ein optisch wenig ansprechendes Ergebnis und zuwenig Gestaltungsmöglichkeiten, um das zu ändern. Gefällt mir nicht.

Zum eigentlichen Thema: wir haben beides implementiert: Skinning auf der GPU und auf der CPU. Das CPU-Skinning war als Fallback gedacht, falls der aktuelle Mesh die Grenzen der GPU sprengt, aber seit Assimp Meshes nach BoneCount aufteilen kann, ist CPU-Skinning bei uns ausgestorben. Meine Tests dazu waren ernüchternd. 30 Charaktere mit ~90 Bones und etwa 10k Dreiecken kamen mit Software Skinning mit Mühe und Not auf 15fps, trotz Core i7 und allen Optimierungen, die mir so einfallen. Das gleiche Szenario auf der GPU rendert mit >60 fps und hängt IMMERNOCH an der CPU als Flaschenhals. Nur ist die CPU halt jetzt mit dem Rest der Landschaft beschäftigt und nicht mehr mit Software Skinning. Ich würde also in jedem Fall zur Nutzung der GPU raten, soweit das nur irgend möglich ist.

Das Berechnen der Skelettpose aus 0 bis x zu mischenden Animationen ist bei uns noch auf der CPU. Das kann durchaus auch Rechenzeit fressen, aber nicht in dem Maße. Oben genannte 30 Charaktere waren mit einer laufenden Animation bei etwa 1 Millisekunde Gesamtrechenzeit pro Frame. Das ist viel, aber nicht so viel, dass ich da in nächster Zeit optimieren werde.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: Eure Erfahrungen mit skeletaler Animation?

Beitrag von Top-OR »

@Aramis:
Danke für deine Antwort.


> Wenn du das Skinning auf der GPU durchfuehrst, kannst du von Instancing profitieren, denn bei Monsterhorden zeichnest du ja letztlich immer dasselbe nur mit jeweils unterschiedlichen Bonematrizen.


Ich habe "befürchtet", dass du bzw. jemand das sagen wird. ;-) Ich werde mich wohl damit doch mal bei Gelegenheit ernster auseinandersetzen. (müssen)



Mein Grund, das bisher zu vermeiden, war (u.A.) der Wunsch bzw. der Gedanke, dass die Modelle möglichst verschieden sein sollten.
Also ändern wir mal das Bild "Monsterhorde" (a la Painkiller und Co.) in „Stadtbewohner“ oder sowas. Da wäre es ja fatal, wenn die alle aussehen würden wie aus der Clone-Fabrik. Eine Möglichkeit, dem zu begegnen wäre dann, die Bewohner aus „Standardteilen“ (und diese dann wieder in der Graka zu halten) zusammenzusetzen, aber so richtig hat mich diese Idee noch nicht umgehauen. Klingt auch im ersten Moment sehr nach Gefriemel...


Auf jeden Fall werde ich diesen Gedankengang mit dem Instancing mal vertiefen. So entschärft man wenigstens das Problem „Monsterhorde“. Ich habs zwar immer vor mir hergeschoben, aber die Grakas haben ja auch inzwischen fast sowiel Speicher wie der ganze Rechner [leicht aufgeschnitten ;-)].



> Stencil-Shadows sind meines Wissens uebrigens ziemlich out.


Ich weiß ... Auch dieses "Experiment" ist schon ein paar Monde alt. Shadowmapping mache ich auch, aber es hat halt alles seine Vor- und Nachteile.

Schon klar, dass vieles nur über Tradeoffs (Calculation ↔ Bandbreite ↔ Speicher) geht.

@Alle: Ich möchte eben gern mal sehen, was Ihr in diesem Punkt so treibt... Also Danke soweit für die Meinungen.q
--
Verallgemeinerungen sind IMMER falsch.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4260
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Eure Erfahrungen mit skeletaler Animation?

Beitrag von Chromanoid »

Top-OR hat geschrieben:Mein Grund, das bisher zu vermeiden, war (u.A.) der Wunsch bzw. der Gedanke, dass die Modelle möglichst verschieden sein sollten.
Also ändern wir mal das Bild "Monsterhorde" (a la Painkiller und Co.) in „Stadtbewohner“ oder sowas. Da wäre es ja fatal, wenn die alle aussehen würden wie aus der Clone-Fabrik. Eine Möglichkeit, dem zu begegnen wäre dann, die Bewohner aus „Standardteilen“ (und diese dann wieder in der Graka zu halten) zusammenzusetzen, aber so richtig hat mich diese Idee noch nicht umgehauen. Klingt auch im ersten Moment sehr nach Gefriemel...
So machen das glaube ich fast alle (Bulletstorm, UT usw.). Evt. kannst du ja mal mit Morphing experimentieren.
Antworten