当你在游戏世界中移动时,我正在开发一个大型游戏,它在关卡数据(包括着色器)中流动。我不希望因为着色器编译/链接或第一次使用它们而导致帧速率下降。您是否可以使用自己的上下文对后台线程预着色?
我有我的着色器编译和链接工作在一个单独的线程与自己的开放的上下文。但是我还没有能够预言着色器在单独的线程上工作(所以在着色器第一次使用时没有性能问题)。
在iOS或OpenGL文档中,预热功能在任何地方都没有提及。然而,在OpenGL ES分析器(从xcode分析时可用的一种仪器)中提到了这一点。在这个工具中,我得到了一个“预编译阶段之外编译的着色器”警告,每次渲染某个着色器之前都没有用过渲染过的着色器。 “扩展细节”如下所示:
“OpenGL ES Analyzer检测到不属于初始预热阶段的着色器编译。为避免它们,预先渲染所有用于着色的着色器。要做到这一点,当应用程序启动时进行预热,并且使用每个着色器程序执行绘图调用,使用着色器程序将使用的任何gl状态设置。混合,颜色遮罩,逻辑ops,multisamping,纹理格式和点原始状态都可以影响着色器编译。“
术语“编译”在这里有点混淆。顶点和片段着色器已经被编译并且程序已经被链接。但是,第一次使用给定的OpenGL状态渲染某些东西时,它会在着色器上做更多的工作来优化它,我猜想。
我有代码在第一次使用之前渲染一个零大小的三角形预先着色着色器。
如果我使用与普通渲染相同的Open GL上下文对主线程上的着色器进行编译,链接和预加热,那么它将起作用。但是,如果我在背景线程上使用单独的Open GL上下文执行它,它将不起作用(它在第一次使用时仍然会收到分析器警告)。
所以......它可能是在单独的上下文中预渲染着色器对其他上下文没有影响。或者可能是因为我没有完全相同的状态来设置单独的上下文。可能需要设置很多潜在的Open GL状态。我在后台线程上使用屏幕外渲染缓冲区,以便可以将其视为状态的一部分。
有没有人成功地在后台线程上获得预感?
感谢您的联系。我意识到PC上也存在这个问题。我更感兴趣的是OpenGL ES上人们对此的体验。如果有人在iOS或其他OpenGL ES平台上进行了这项工作,那么这将非常有用。否则,我将不得不求助于开发一个系统,在该系统中,我可以预先计算可以在某个关卡中使用的所有着色器以及它们在哪个上下文中使用 - 然后在初始加载过程中预热它们。 – Namaste 2012-01-26 22:53:33
Ati的链接已过期。新建:http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/ATI_OpenGL_Programming_and_Optimization_Guide.pdf – 2014-08-25 10:33:55