Why Skinned Meshes Are Hard to Render at Scale

What is a skinned mesh?
A mesh is the surface of a 3D object. Made of tiny triangles. A static mesh is something that never moves. A rock. A wall. A tree.
A skinned mesh is a mesh with a skeleton inside. The skeleton moves and the surface bends with it. Every game character that walks, jumps, or waves is a skinned mesh.
That is all the term means. A 3D model that can animate because it has bones attached to it.
What is instancing?
Say you need to draw 1000 trees in a scene. Without instancing the GPU processes the tree model 1000 separate times. That is 1000 draw calls. A draw call is one request from the CPU telling the GPU to draw something. Each one has overhead. Too many and the game slows down.
With instancing you send the tree model to the GPU once. Then you say: draw it 1000 times at these 1000 positions. One draw call. The GPU handles the copies. This is extremely fast.
Why instancing works easily for static meshes
A rock is a rock. Every copy is identical. Same shape. Same triangles. The GPU just stamps it across the scene. No extra math needed per copy.
Why instancing breaks with skinned meshes
A skinned mesh is different every frame. Each character has its own skeleton pose. One is running. One is jumping. One is idle. The skeleton bends the mesh into a unique shape for each character.
So you cannot just stamp copies. Each copy needs its own bone positions calculated. Each copy deforms the mesh differently. The GPU has to do unique work per character.
It gets worse. In many games characters wear different gear. Different armor. Different weapons. Different hats. Now each character is not even the same model anymore. You cannot instance things that are not the same.
This is why games with many animated characters on screen are hard to optimize. Each skinned mesh is expensive and difficult to batch together.
What is frustum culling?
Your camera only sees part of the world. The visible area forms a shape called a frustum. Think of it like a pyramid with the tip cut off. Anything inside that shape is on screen. Anything outside is not.
Frustum culling means: do not draw things the camera cannot see. If a character is behind you, skip it. Do not send it to the GPU at all. This saves a lot of performance because in most scenes more than half the objects are off screen.
What does "2000 instanced skinned meshes at 120fps" mean?
It means someone found a way to draw 2000 animated characters at once while keeping the game smooth at 120 frames per second. Each character has its own skeleton pose AND unique geometry because of different gear and body parts. Doing this in a web browser makes it even more impressive because browsers are slower than native game engines.
The trick usually involves a few techniques combined:
One giant array buffer. Instead of sending each character as a separate draw call, pack all the unique geometry into one massive list of numbers in GPU memory. The GPU reads through one big buffer much faster than switching between thousands of small ones.
Instanced skeletons. The characters share the same bone structure even though their meshes look different. The skeleton system is instanced and applies different poses to different sections of that buffer.
GPU skinning. Move the bone calculations from the CPU to the GPU. The GPU is better at doing the same math on thousands of things at once.
Texture-based animation. Bake all the bone positions into a texture image. The GPU reads the texture to know how each bone should be positioned. This avoids sending skeleton data per character every frame.
Frustum culling. Skip characters that are off screen.
Dynamic geometry updates. Update only the parts that changed instead of recalculating everything from scratch.





