渲染器效率

时间:2010-11-15 01:06:56

标签: c++ opengl sdl

好的,我有一个渲染器类,它具有由程序其余部分调用的各种特殊功能:

  • DrawBoxFilled
  • DrawText的
  • 的DrawLine
  • 大约30多个......

这些函数中的每一个都可以分别调用glBegin / glEnd,我知道它的效率非常低(甚至已经弃用了)。所以无论如何,我计划完全重写渲染器,我需要知道设置函数的最有效方法,这样当有东西调用它时,它会立即绘制它,或者它需要做的任何其他事情,所以它会有效地运行 大多数 。在此先感谢:)

2 个答案:

答案 0 :(得分:6)

渲染的有效方法通常是使用VBO(顶点缓冲对象)来存储顶点数据,但这只是在渲染(主要是)静态数据时才有意义。

如果不了解您的应用程序应该呈现的内容,很难说您应该如何构建它。但理想情况下,您不应该绘制单个基元,而是绘制顶点缓冲区的内容(子集)。

答案 1 :(得分:4)

最有效的方法是不要暴露这种低级方法。相反,您要做的是构建一个scene graph,它是一个包含整个场景表示的数据结构。您可以在“更新”方法中更新场景图,然后在“渲染”方法中一次性渲染整个场景。

另一种稍微不同的方法是每帧重建整个场景图。这具有以下优点:一旦构成场景图,它就不会改变。因此,当您的“更新”方法正在进行时,您可以在另一个线程上调用“渲染”方法,同时为下一个帧构建场景。

如果没有完整的场景图,许多更高级的效果根本不可能。例如,您不能进行阴影贴图(这需要您从不同的角度多次渲染场景),您不能进行延迟渲染,它还会生成依赖于排序绘制顺序的任何内容(例如,alpha混合)非常困难。

从您的方法名称看起来您正在使用2D,因此虽然您的要素列表上的阴影贴图可能不高,但是alpha混合延迟渲染可能是。