I built a system to render 40,000+ animated characters in Unreal Engine 5
The short version: normal skeletal meshes in UE5 fall apart way before you hit thousands of characters — bone animation, per-object overhead, draw calls, all of it adds up fast. So instead I bake every animation into a texture (bone matrices, one block per frame) and read it straight in the vertex shader through a custom vertex factory. Each character on screen is just a lightweight instance — a transform, which animation, what time — instead of a full component.
To let individual characters look different (skin tone, outfit color, whatever) without spawning a material per character, I pack an RGB color into a single float and unpack it in the shader from per-instance data.
For behavior — movement runs in parallel across the whole crowd at once instead of one-by-one, obstacle avoidance uses the navmesh baked into a grid for fast lookups, and agents can be hit, knocked into a real ragdoll, or reactively pushed around.
Tested it on a several different PCs, from a beefy desktop down to a laptop with integrated graphics. On strong hardware the system itself barely costs anything — GPU is basically always the actual bottleneck, not the crowd logic.
Happy to answer questions or go deeper into any part of this if people are curious.