Efficiency of VAO with VBO for every Model

In my experience, separate VBO per model (without VAOs or NV bindless) performs poorly – it’s even worse than client arrays. I’d expect one-VBO per model with one VAO for all (what I think you’re talking about above) to be nearly the same performance.

Sep VBO per model but also using one VAO per model (not just one shared across all of them) can speed that up some, but you still end up with a lot of cache thrashing just getting the vertex arrays bound and enabled with a bazillion VAOs floating about.

For best results in my experience, either use NVidia bindless for vtx attrib/index list binds/enables (particularly in the case where you have a lot of static VBOs with smallish batches), OR use a streaming VBO approach (similar to what client arrays probably does under-the-hood) as those two approaches avoid nearly all of the overhead of binding many VBOs to render a frame.

Otherwise, lots of VBO binds can kill your performance.