Performance of gltf/glb models vs primitives

I'm wondering why the performance of loaded 3D models is so much worse than geometry generated by Cesium itself.

I have an application where I'm loading 7735 extremely simple 3D models - they are just cones with 32 polygons. This results in me getting about 10 fps.

However, if I instead generate the same number of models using a cylinder with 32 slices, I get a solid 60 fps. How can this be so when the amount of polygons I'm rendering in either case is the same?

Is there anything I can do to improve the performance of loaded 3D models? All of the things I have tried so far then only which helped a little bit was to turn off shadows.

In this case the performance drop is not because of the number of triangles drawn, but how many draw calls are sent each frame. 3D models are treated as individual drawn calls whereas Cesium geometries are often batched together and drawn with just one (or a few) draw calls. The overhead of each draw calls makes a big difference to the performance.

Are all your models the same? You may want to check out model instancing which is on the 3d-tiles branch: https://github.com/AnalyticalGraphicsInc/cesium/blob/3d-tiles/Source/Scene/ModelInstanceCollection.js and the sandcastle demo for it (http://localhost:8080/Apps/Sandcastle/index.html?src=development/3D%20Models%20Instancing.html&label=Development). These are not part of the public API yet though, so just be wary that the functionality could change.

Very informative, thanks a lot Sean! I'll have a look at the things you suggested.