在OpenGL中一次生成多个索引(名称)是否有优势?

时间:2015-08-03 17:27:37

标签: opengl

glGenVertexArraysn等函数的{{1}}参数允许生成多个索引名称。

我的问题是:一次生成多个索引名称与一次生成1个名称有什么好处?有吗?

背景:我正在构建一个面向对象的框架,但我不知道是否应该为 index name wizardry添加功能(以更复杂的接口为代价)或者只需根据需要自动生成单个索引名称。

2 个答案:

答案 0 :(得分:4)

在实践中它没有任何区别。如果你看一下处理着色器的API部分,你会发现,它确实一次只返回一个索引。事实上,许多经验丰富的OpenGL编码器更喜欢将{glgen ...函数包装在myglCreate…函数中,这些函数只返回所需对象类的一个名称。

答案 1 :(得分:1)

我完全同意@ datenwolf的建议,但想提供更多推理。如果它是最方便的事情,我只会给glGen*()打电话给多个名字。如果您已经拥有一系列名称,并希望一次创建所有名称,那么请继续使用单个调用。但它绝对不值得跳过任何环节,我无法想象一个有助于提高性能的现实场景。

glGen*()次调用仅创建对象名称(这是官方的OpenGL术语,即使很多人称之为" ids"),而不是对象。仅在第一次绑定名称时才创建实际对象。因此,一次创建多个对象无法获得收益,唯一(微不足道的)收益来自同时生成多个名称。

我可以想到两个相关的原因,为什么生成名称不仅仅是海洋中的一滴:

  • 它并不是以高频率发生的。您通常应该担心的是非常频繁的调用,例如在绘制调用之间进行的状态更新调用以及绘制调用本身。 名称生成通常在设置期间以适中的频率发生,并且很少在以后发生。也许你每隔一段时间就会创建一个新的缓冲区或纹理,但与绑定纹理或缓冲区的频率相比,这几乎是微不足道的。
  • 它与更昂贵的操作联系在一起。您只需生成创建实际对象所需的名称。创建对象比生成名称更加 更昂贵。如果您想象创建典型对象(各种内存分配,状态设置等)所需的一切,生成名称是一个无关紧要的部分。