OpenGL优化技巧


26

要提高OpenGL的效率,您有什么技巧?

Answers:


16

使用VBO而不是glStart()/ glEnd()。这样可以节省将数据传输到GPU内存的周期。


7
不仅如此,在更高的版本中不推荐使用glBegin和glEnd,并且在3.x及更高版本中将它们完全删除(因此将无法使用)。如果您请求OpenGL 3.x上下文,则将无法完全使用它们。
吞噬疯狂的撕裂

DirectX实际上将其强加给您,它没有的等效项glStart()/glEnd()
knight666

@SAHChandler我不知道。我没有意识到它已被弃用。
MrValdez

3
@SAHChandler:太烂了!我使用glBegin()和glEnd()学习了所有绘图。不!

8

尽管工具略有不同,但轮廓,轮廓,轮廓的标准提示也适用于此。

gDEBugger擅长帮助您准确了解引擎盖下的情况。不过很贵。


2
只是想补充一点,它现在是免费的。
DMan 2010年

8

这些来自Apple在OpenGL上的文档参考,但是一点点帮助对不对?;)

OpenGL性能优化:在OS X上优化OpenGL数据吞吐量的基础知识

(最后一个是示例应用程序)
顶点优化

关于这个主题,也有很多关于OpenGL扩展的视频(也来自Apple)。它们中的一些特定于OS X,但其他一些则更为通用,很可能会应用于Windows和Linux。

您可以在此处找到视频。您确实需要iTunes和Apple帐户才能查看它们(但它们是免费的!:D)


7

好吧,这确实取决于您打算做什么,但是这里有一些基本知识:

  • 当GPU是饥饿的动物时,您的CPU非常宝贵。尽可能向GPU偏移。如今,您可以使用出色的库(例如OpenCL,CUDA和Thrust)来做到这一点。

  • 在着色器中进行照明。这不仅可以帮助您保持理智,还可以使您使用非常酷的东西,例如卡通着色器和延迟照明

  • 颗粒吸。即使使用OpenGL点精灵。


6

最小化您的状态更改。在许多平台上,每个状态更改都可能刷新管道。最好将类似的项目一起批处理并更改一次状态。


4
glEnable(GL_CULL_FACES);

简单的一种衬里,适用于背面剔除。这对于减少多边形数量非常有用。还要研究“平截头体/遮挡”剔除以减少多边形数。

要研究的另一件事是用于矢量和四元数的SIMD(主要用于相机旋转)。如果您不想弄乱ASM,请查看libSIMD,它是一个用C语言处理SIMD的好库。


4

当您可以访问局部变量时,请不要使用glGet *,例如:

  • 不要从OpenGL查询纹理大小,而是在加载时将其存储在变量中
  • 当您可以将更改存储在应用程序中时,请勿从OpenGL查询线宽/点大小

这些电话真的很慢

如果未使用的内容在内部未发生变化,则将其移至glBegin-glEnd子句之外(无论是glColor或glNormal或其他内容)。OpenGL是状态机,它使用最后一个值。


3

最小化OpenGL命令是关键。因此,您必须批处理所有绘图命令。对于2d游戏,最好使用Altas Texture,并在一个opengl命令中绘制共享相同纹理的所有sprite。


小心。较少和较大的批次是有用的,但是取决于目标平台,“太大”的批次将降低性能。
Andreas

3

批,批,批!(ab)在每次绘制调用中使用GPU渲染尽可能多的图像。游戏主要受状态变化量的限制,而不受三角形数量的限制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.