According to my understanding of what I have been reading, a VBO is the fastest way to draw a collection because it is server-side.
However, I also read that a display list doesn’t suffer from data transfer bottlenecks like a regular vertex array because it is also server side, but it does not allow it’s contents to be changed.
Therefore, am I correct to assume that if I have a collection of unchanging data such as static terrain in a display list I would NOT get any real performance increase by switching to a VBO?
You can use VBO specially for static data. And VBO came after display list. So I’d prefer using VBO. Comparing the 2 is very hard and maybe display list, when compiled, are now transformed into VBO, just like now the fixed pipeline is emulated now by the shaders.
You are absolutely right considering NVIDA implementation. Not sure for AMD. Probably VBO is a better solution for AMD.
That is nearly always the case, in my experience.
On NVidia hardware, display lists give you some speed-ups that you cannot get through vanilla VBOs. To get them you need to use a vendor-specific extension: NV_vertex_buffer_unified_memory.
I say “nearly always” because someone did identify a case where display lists don’t perform as well as they could: that is, using a bunch of Begin/End pairs (i.e. a bunch of batches) when one pair or a very few pairs would have sufficed: link. The solution: just throw out most of the Begins/Ends, and toss everything in one big Begin/End block. That said, there’s little sense in using immediate mode anymore. You can build display lists from vertex arrays just as well.
The main problem with just using display lists is that they take a while to build. A secondary problem is that they consume GPU memory and you have no direct control over how much or how that memory is managed. With VBOs, you gain some control over these factors.
In fact, as I observed, display lists are always somewhat faster than VBOs on both ATI and NVIDIA, however I think this performance difference comes from the fact that drivers do make VBOs from the display list and the drivers are likely to select such formats that perform the best on the particular platform you use.
Even though I’ve seen this on current NVIDIA and ATI cards, I would rather go to the VBO direction, even though it may not outperform display lists, it is the way to go nowadays and you can also get more familiar with what data formats the GPUs like to “eat” based on experiments.
Thanks for all the information. I see that I will have to experiment with it to get more detailed results. But if it’s all fairly hardware dependent then that makes portability a little more complicated.
on AMD implementation, there is no magic HW which will make display list go faster than VBO. if you see any difference between the two path, it really is:
- the driver has lots of software optimizations for display list that you might not have in your VBO implementation
- the driver cannot detect how to optimize your display list
- there is a different CPU overhead between the two approaches
overall, VBO are a good approach if you want to get good performance, since you have explicit control and can tune based on your specific needs. with DL, your performance will limited by the level of optimization any IHV is able to put into it.