2012-01-10 22 views
8

当你在游戏世界中移动时,我正在开发一个大型游戏,它在关卡数据(包括着色器)中流动。我不希望因为着色器编译/链接或第一次使用它们而导致帧速率下降。您是否可以使用自己的上下文对后台线程预着色?

我有我的着色器编译和链接工作在一个单独的线程与自己的开放的上下文。但是我还没有能够预言着色器在单独的线程上工作(所以在着色器第一次使用时没有性能问题)。

在iOS或OpenGL文档中,预热功能在任何地方都没有提及。然而,在OpenGL ES分析器(从xcode分析时可用的一种仪器)中提到了这一点。在这个工具中,我得到了一个“预编译阶段之外编译的着色器”警告,每次渲染某个着色器之前都没有用过渲染过的着色器。 “扩展细节”如下所示:

“OpenGL ES Analyzer检测到不属于初始预热阶段的着色器编译。为避免它们,预先渲染所有用于着色的着色器。要做到这一点,当应用程序启动时进行预热,并且使用每个着色器程序执行绘图调用,使用着色器程序将使用的任何gl状态设置。混合,颜色遮罩,逻辑ops,multisamping,纹理格式和点原始状态都可以影响着色器编译。“

术语“编译”在这里有点混淆。顶点和片段着色器已经被编译并且程序已经被链接。但是,第一次使用给定的OpenGL状态渲染某些东西时,它会在着色器上做更多的工作来优化它,我猜想。

我有代码在第一次使用之前渲染一个零大小的三角形预先着色着色器。

如果我使用与普通渲染相同的Open GL上下文对主线程上的着色器进行编译,链接和预加热,那么它将起作用。但是,如果我在背景线程上使用单独的Open GL上下文执行它,它将不起作用(它在第一次使用时仍然会收到分析器警告)。

所以......它可能是在单独的上下文中预渲染着色器对其他上下文没有影响。或者可能是因为我没有完全相同的状态来设置单独的上下文。可能需要设置很多潜在的Open GL状态。我在后台线程上使用屏幕外渲染缓冲区,以便可以将其视为状态的一部分。

有没有人成功地在后台线程上获得预感?

回答

6

说实话,在昨天之前,我对这件事情一无所知,尽管我一直在做我的引擎优化工作。所以,首先,谢谢你的提示:)。

从那时起,我研究了着色器变暖主题,但我还没有发现太多东西。

我找到一提名为“ATI的OpenGL编程和优化指南”的文件在AMD官方文档:

http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&ved=0CEoQFjAF&url=http%3A%2F%2Fdeveloper.amd.com%2Fmedia%2Fgpu_assets%2FATI_OpenGL_Programming_and_Optimization_Guide.pdf&ei=3HIeT_-jKYbf8AOx3o3BDg&usg=AFQjCNFProzLiXf5Aqqs4jZ2jOb4x0pssg&sig2=6YV7SVA97EFglXv_SX5weg

这是其中指着色变暖的摘录:

引用:

虽然R500本身支持在片段着色单元的流量控制,R300和R400的ASIC 不。 R300和R400的静态流量控制由驱动程序编译出 未使用的条件并根据设置的常量展开循环来模拟。尽管R500 asics系列本身支持流量控制,但驱动程序仍会尝试编译静态流量条件,使其能够重组着色器指令以实现更好的指令调度。驱动程序还会尝试将 缓存为针对特定静态流条件编译的着色器,以便预期重用。因此,当编写使用静态流控制的片段程序时,建议通过在使用与着色器生命周期相关的常见静态条件 排列的第一帧上渲染虚拟三角形来“着色”着色器高速缓存 。

我已经发现身边最好的解释是:

http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/

报价:

顺便说一句,这也是为什么你会经常看到的延迟,你第一次使用的原因一个新的着色器或资源;很多创建/编译工作都由驱动程序推迟,只有在实际需要时才会执行(您不会相信某些应用程序创建了多少未使用的废话!)。图形程序员知道故事的另一面 - 如果你想确定一些东西是真正创建的(而不是仅仅保留内存),你需要发出一个虚拟绘制调用,用它来“加热”。丑陋而令人讨厌,但自1999年我开始使用3D硬件以来就是这种情况 - 这意味着,从这一点来看,它几乎是一个生活中的事实,所以要习惯它。 :)

在本演示文稿中,提到了cryteck引擎如何在远程引擎上执行它,尽管它主要与DirectX相关。

http://www.powershow.com/view/11f2b1-MzUxN/Far_Cry_and_DirectX_flash_ppt_presentation

我希望这些链接以某种方式帮助。

+0

感谢您的联系。我意识到PC上也存在这个问题。我更感兴趣的是OpenGL ES上人们对此的体验。如果有人在iOS或其他OpenGL ES平台上进行了这项工作,那么这将非常有用。否则,我将不得不求助于开发一个系统,在该系统中,我可以预先计算可以在某个关卡中使用的所有着色器以及它们在哪个上下文中使用 - 然后在初始加载过程中预热它们。 – Namaste 2012-01-26 22:53:33

+0

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

相关问题