Mastering the MultitudeMaîtriser la multitude

Research report: a comparative analysis of the USD and Alembic workflows in crowd simulation

Rapport de recherche : analyse comparative du workflow USD et de l'Alembic en simulation de foule

Houdini USD Solaris

Written as part of my final year at ESMA Toulouse, supervised by Xavier Aliot, on the crowd of over 500 dynamic robots animated for the graduation film Mortal Koil

Rédigé dans le cadre de ma dernière année à l'ESMA Toulouse, sous la supervision de Xavier Aliot, autour de la crowd de plus de 500 robots dynamiques animée pour le film de fin d'études Mortal Koil

The questionLa question

For over a decade, Alembic was the standard for exchanging geometry data. But its linear, "baked" nature means any change forces a full re-export, a real bottleneck under production pressure. USD, built by Pixar as a non-destructive layered structure, promises something different. This report asks a direct question: does a USD crowd workflow in Houdini actually outperform Alembic on data volume and on freedom to iterate

Pendant plus d'une décennie, l'Alembic a été le standard pour l'échange de données géométriques. Mais sa nature linéaire et "cuite" impose un ré-export complet à la moindre retouche, un vrai goulot d'étranglement en production. L'USD, conçu par Pixar comme une structure non-destructive en couches, promet autre chose. Ce rapport pose une question directe : le workflow USD en crowd sur Houdini surpasse-t-il vraiment l'Alembic sur le volume de données et la liberté d'itération

Context: a 272-PC farmContexte : une farm de 272 PC

The experiments ran in a school production environment close to a real studio: a Tractor 2.4 render farm of 272 machines, with 190 to 200 typically available, each with at least 16 Go of RAM and a 12-core CPU. Loading the full 400-agent crowd into memory took about 10 minutes per machine, with rendering itself taking roughly 15 minutes a frame, meaning the real bottleneck was data loading, not the render

Les expérimentations se sont déroulées dans un environnement de production scolaire proche d'un vrai studio : une farm Tractor 2.4 de 272 machines, dont 190 à 200 disponibles en moyenne, chacune avec au moins 16 Go de RAM et un processeur 12 cœurs. Charger la crowd complète de 400 agents en mémoire prenait environ 10 minutes par machine, le rendu lui-même environ 15 minutes par image, le vrai goulot d'étranglement étant donc le chargement des données, pas le rendu

Method: starting from a cubeMéthode : partir d'un cube

Rather than testing directly on production assets, the protocol started deliberately small: a cube, then a handful of simple objects, to validate the USD layering logic in isolation. Complexity was then raised step by step, from a robot's hand, to its bust, to the full 2-million-polygon character, exporting geometry, rig and animation as three separate layers at every stage and validating visually before moving on

Plutôt que de tester directement sur les assets de production, le protocole a délibérément commencé petit : un cube, puis une dizaine d'objets simples, pour valider la logique de layering USD isolément. La complexité a ensuite été augmentée progressivement, de la main d'un robot, à son buste, jusqu'au personnage complet à 2 millions de polygones, en exportant géométrie, rig et animation comme trois couches séparées à chaque étape, validées visuellement avant de continuer

×122 Reduction, isolated character (7.08 Go Alembic → 57.91 Mo USD) Réduction, personnage isolé (7,08 Go Alembic → 57,91 Mo USD)
5s USD export time, vs 2 min 43 in Alembic Temps d'export USD, contre 2 min 43 en Alembic
50,5 Mo USD geometry, 5 crowd variants (157.8 Mo in Alembic) Géométrie USD, 5 variantes de crowd (157,8 Mo en Alembic)
×6 500+ Crowd cache, 400 agents / 70 frames (138.6 Mo vs > 900 Go) Cache crowd, 400 agents / 70 frames (138,6 Mo contre > 900 Go)

Why the gap is this largePourquoi un tel écart

Alembic bakes every vertex position on every frame. USD's animation layer stores only joint transforms, at 0.297 Mo for the isolated character, while geometry and rig stay untouched and shared across every shot in the film. Rig layers for the five crowd variants weigh between 278 Ko and 893 Ko each, under 2.3 Mo combined, against Maya source scenes averaging over 300 Mo per character

L'Alembic cuit la position de chaque vertex à chaque frame. Le layer d'animation USD ne stocke que les transformations de joints, 0,297 Mo pour le personnage isolé, pendant que géométrie et rig restent intacts et partagés entre tous les shots du film. Les layers de rig des cinq variantes de crowd pèsent chacun entre 278 Ko et 893 Ko, moins de 2,3 Mo au total, contre des scènes Maya sources dépassant 300 Mo en moyenne par personnage

Full control in LOPsContrôle total en LOP

Variant Sets assign each agent one of five geometries without duplicating any file, a change to one variant instantly propagates to every agent using it. A second Variant Set handles LOD, switching based on camera distance to lighten background agents. A Python LOP script computes the camera frustum and prunes out-of-frame agents automatically, a fully reversible, non-destructive operation

Les Variant Sets assignent à chaque agent l'une des cinq géométries sans dupliquer aucun fichier, modifier une variante se répercute instantanément sur tous les agents qui l'utilisent. Un second Variant Set gère le LOD, activé selon la distance à la caméra pour alléger les agents en arrière-plan. Un script Python LOP calcule le frustum de la caméra et désactive automatiquement les agents hors champ, une opération entièrement réversible et non destructive

Limits found in productionLimites rencontrées en production

USD's layering has a real cost: resolving many nested references at load time made the viewport slow on dense scenes, tied directly to the farm's 16 Go RAM machines. The workaround was lightweight assembly layers loading 50 agents for daily lookdev work, sending the full 400 to the farm only for final renders

Le layering USD a un vrai coût : résoudre de nombreuses références imbriquées au chargement rendait le viewport lent sur les scènes denses, directement lié aux machines à 16 Go de RAM de la farm. La parade a été des layers d'assemblage allégés chargeant 50 agents pour le travail quotidien, les 400 complets n'étant envoyés qu'au rendu final sur la farm

ConclusionConclusion

The results confirm both hypotheses: USD outperforms Alembic on data volume and on iteration speed. It isn't that USD makes crowd simulation simpler, it's that it gives the tools to actually control it, provided the gap between a simple test case and 400 rigged robots is taken seriously

Les résultats confirment les deux hypothèses : l'USD surpasse l'Alembic en volume de données comme en vitesse d'itération. L'USD ne simplifie pas la simulation de foule, il donne les outils pour vraiment la maîtriser, à condition de prendre au sérieux l'écart entre un cas de test simple et 400 robots riggés