2010-11-15 111 views
2

好吧,我有其中有各种由程序的其余部分称为特殊功能的渲染器类:渲染效率

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

这些函数中的每一个函数调用glBegin/glEnd可分离,我知道这可能是非常低效(甚至不推荐使用)。因此,无论如何,我正计划对渲染器进行全面重写,并且我需要知道设置函数的最有效方法,以便当某个东西调用它时,它立即全部绘制它,或者其他任何需要这样做的东西运行大多数有效。在此先感谢:)

+0

你的应用程序做了什么?它需要绘制什么?你为什么单独绘制文本和线条? – jalf 2010-11-15 01:09:56

+0

该程序设置为一系列状态。每个状态需要绘制不同的对象,如文本,框或其他东西。 Like Singleton :: get()。drawText(“Yea ...”,10,10); – Matt 2010-11-15 01:24:44

+0

这个场景有多频繁?何时添加或删除对象?每帧,或者仅当改变状态时(我认为这种情况有点罕见) – jalf 2010-11-15 01:33:51

回答

4

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

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

如果没有完整的场景图,许多更高级的效果根本无法实现。例如,你不能做阴影贴图(它需要你从不同的角度多次渲染场景),你不能做延迟渲染,它也会使任何依赖排序绘制顺序的东西(例如,alpha混合)非常困难。

从您的方法名称看,它看起来像是在2D中工作,因此虽然阴影贴图在功能列表中可能不高,但alpha混合延迟渲染可能会是。

6

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

不知道更多关于你的应用程序应该渲染什么,很难说你应该如何构造它。但理想情况下,您不应绘制单个基元,而应绘制顶点缓冲区的内容(子集)。