Ok, I think I got it now.
I made a test with 500 teapots parented to 500 animated point helpers.
With 4 segment teapots (1024 faces), the performance was 30 fps.
The same performance was achieved when the primitive was collapsed to Editable Mesh.
With the same teapot saved as single frame XMesh, loaded in Single Frame Only mode and cloned 500 times, linked to the point helpers, it was 17 fps.
When I collapsed the XMeshes to Editable Mesh, it went back to 30 fps.
Then I increased the number of of segments to 32 (65536 faces), and tested both primitives and XMesh.
The primitive teapots run between 13 and 15 fps.
The XMesh teapots played back at around 10.9 - 11 fps.
However, when I made the XMesh with “Load Single Frame Only” unchecked, the performance went down to 0.29 fps!!!
So I went back and tested with the 4 segments XMesh but with “Load Single Frame Only” unchecked, and it went down to 3.8 fps…
I have to ask - are your XMesh Loaders set to “Load Single Frame Only”?
It appears to make a big difference when loading multiple heavy meshes (it is much less obvious when loading a single XMesh set to Custom Range with the same start and end values).
If they are not, you can run the following MAXScript expression to switch them all to “Load Single Frame Only” mode:
for o in getClassInstances XMeshLoader do o.loadSingleFrame = true
See if that solves the issue…
Of course, you could collapse them all to EditableMesh, but then you won’t be able to use them as external references.