Since this thread seems to be filled with a lot of misinformation, I’ll do my best to give a recommendation, although I can’t guarantee that what I say is 100% correct either.
The purpose of all buffer objects to reduce the number of opengl calls.
VBOs do this by A) buffering all the data into one draw call; and B) redrawing the same buffer multiple times.
The optimal use of VBOs is one that takes advantage of both those aspects. The less VBOs you have, the less draw calls. Therefore wherever possible you should try to fit as much data as possible into one VBO.
However, some data may change more frequently than others. If you have some data that never changes, some data that changes every X frames, and some that changes every frame, you should be putting each group into a different VBO. (Another thing to note is that for data that irregularly changes, you should try and group it in a way that it changes at the same time to avoid unneccessary rebuffering)
Furthermore, you can hint to the GPU how often you the data should be changing. There’s no guarantee that this will increase performance, but there’s no loss and a potentially decent gain.
For data that changes every frame, use GL_STREAM_DRAW.
For data that never changes, use GL_STATIC_DRAW.
For data that is somewhere in the middle, use GL_DYNAMIC_DRAW.
Finally, there is a ‘magic number’ that gives you the optimal maximum size of a VBO. ‘GL12.GL_MAX_ELEMENTS_VERTICES’. The closer you can get to this number without going over, the more efficient your VBOs will be.