每帧调用glBufferData时,GL_DYNAMIC_DRAW与GL_STATIC_DRAW该如何选择?
关于每帧调用glBufferData时的usage参数选择
核心结论
应该选择GL_DYNAMIC_DRAW,而非GL_STATIC_DRAW。
具体分析
usage参数的本质:
GL_STATIC_DRAW是给GPU的提示:缓冲区数据几乎不会更改,GPU会将其放在适合GPU只读访问的内存区域(如显存深处),优化读取性能,但CPU上传数据的写入开销很高。GL_DYNAMIC_DRAW是给GPU的提示:缓冲区数据会频繁更新,GPU会将其放在CPU和GPU都能高效读写的内存区域(如AGP内存或显存可映射区块),降低CPU上传数据的开销。
场景适配性:
你每帧都要通过glBufferData更新整个缓冲区(甚至可能重新分配内存),这种高频写入场景完全匹配GL_DYNAMIC_DRAW的设计目标。如果选GL_STATIC_DRAW,每帧往GPU优化过的只读区域写入数据,反而会产生额外拷贝开销,拖慢性能。GL_DYNAMIC_DRAW对后续调用的影响:
usage只是GPU的优化提示,没有强制约束。每次调用glBufferData时,指定的usage会作用于当前缓冲区(无论新分配还是原有缓冲区),不会对后续glBufferData调用产生遗留限制。即使之前用了GL_DYNAMIC_DRAW,下次调用换其他usage也完全可行,GPU会根据新提示调整内存策略。
补充提醒
如果后续能预估顶点数量上限,建议提前分配足够大的缓冲区,改用glBufferSubData更新数据,可避免频繁内存重分配,进一步提升性能。
内容的提问来源于stack exchange,提问作者Jason C
相关产品推荐
相关产品推荐

