之前因为要用到NVPerfHud,所以装的是78.01的driver
然后结果即像提到的那样,不管如何优化,vbo相比var,fps总会掉近1/5
怎么试都是一样,情况不像想象中那么简单: 应该会和D3D中VB的lock/unlock一样吧(<--- 天真)
最后看到有人说nvidia和ati的实现不一样,nvidia有做MRU之类的优化,ati则在处理STATIC_DRAW会简单得video memory > AGP memory > system memory,最重要的是OpenGL是依赖于driver的
所以去下了个最新的81.98装上
结果发现差距没有了,晕~
结论:
1. 因为目前ogl的驱动已经很成熟的情况下,一些过去的Efficient方法,现在并不一定实用了:像是说带Range的比普通DrawElements要快一说
2. var是system memory级,在draw时会copy到AGP或Video的memory中;而vbo会由client指定由driver决定将data放在哪,通常会放在“比较合适”的地方
3. vbo在create和lock时要注意,类似D3D的VB在使用中要注意的:WRITE_ONLY、DISCARD、NOOVERWRITE,这些flag的使用,会很大程度上影响到效率,以下是说明
非WRITE_ONLY的数据,即会READ,而我们知道Video memory在READ起来是很慢的
在lock住VB写数据时,DISCARD会告诉driver,不需要等待GPU的同步,因为不需要之前旧的数据
在lock住VB写数据时,NOOVERWRITE会告诉driver,不需要等待GPU的同步,因为不会影响到已有的数据
4. vbo适合static buffer,这时通常会比var快近一倍;而dynamic buffer,就目前来看,至少OpenGL在nvidia的drvier实现中差别不大
5. vbo是存在有“最佳传输量”的,在不同的显卡上,其“最佳数据量/fps影响”也不同,有人做了专门的benchmark
PS,以上乱说一气,保持了一直以来的记流水帐的风格,见谅见谅~