VAs are for dynamic data
VBOs are for static data
Displaylists are for static data
Using VBOs can save you a lot of vRAM, as you can use indexed data, which is impossible in Displaylists.
The down-side of VBOs is that the amount of calls per object can grow rapidly (vertices, texcoords, normals, indices). With Displaylists you can easily group a few hundred and use only 1 call.
int[] lists = new int[objCount * 2];
lists[0] ---> translate to obj[0].xyz
lists[1] ---> render obj[0]
lists[2] ---> translate to obj[1].xyz (relative to obj[0], so no push/pop required)
lists[3] ---> render obj[1]
// etc etc
glPushMatrix();
glCallLists(IntBuffer);
glPopMatrix();
You can also nest Displaylists:
world list
- object list
- sublist: push
- sublist: translate + rotate
- sublist: render object
- sublist: pop
- object list
- sublist: push
- sublist: translate + rotate
- sublist: render object
- sublist: pop
When you have to translate+rotate any object in the scene, you only have to change 1 sublist, then call the world-list which will traverse the entire tree.
Another option is to have 1 displaylist contain a rotation for your billboards:
world list
- object list
- sublist: push, translate
- global rotation list
- sublist: render object, pop
- object list
- sublist: push, translate
- global rotation list
- sublist: render object, pop
So if you really know what you are doing, displaylists are definitly the way to go (if you can spare some vRAM).
HTH