簡體   English   中英

為什么glUseProgram這么慢?

[英]Why is glUseProgram so slow?

我一直在編寫一個視頻應用程序,該應用程序可以使用OS X上的GLSL將具有許多不同覆蓋層的視頻呈現到不同的設備上。

在相對較新的機器(視網膜MacBook Pro)上嘗試時,一切工作都很好,但是我現在有了一台較舊的機器(帶有Nvidia GT 120的MacPro 4,1),並且遇到了瓶頸,我希望找到解決方案。

我的應用程序基本上呈現紋理和簡單圖元。 我有一些着色器可以完成不同的工作。 一個用於繪制紋理,一個用於繪制圓形,一個用於繪制條形圖……我基本上是通過將glUseProgram()渲染到幀緩沖區中來適當地glUseProgram()應用着色器。

在大多數情況下,每個渲染過程的執行速度都非常快(<5毫秒),但有時會花費20毫秒以上的時間,這是一個問題,因為我以3-4 fps = 41.6667 ms的速度為3-4設備提供服務每幀。

我發現問題是在將上下文設置為當前上下文后直接調用glUseProgram。 這是代碼:

CGLSetCurrentContext(device.renderingContext);
CGLLockContext(device.renderingContext);
// Setting and locking the context sometimes causes an inevitable GL error.
// We must clear the error here to enable proper error checking below.
glGetError();

[device bindFramebuffer];
GetError();

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glViewport(0.0f, 0.0f, deviceSize.width, deviceSize.height);

glUseProgram(self.texApplyShader.program);
GetError();

誰能告訴我這可能是由什么引起的,以及為什么它只是偶爾發生? 我的繪制方法有意義嗎?或者最好使用一個着色器來完成所有工作?

編輯:我剛剛在freenode IRC上與一些OpenGL專家交談,他們告訴我glUseProgram調用本身很可能。 他們的確是正確的。 OpenGL管道似乎在切換着色器之前等待。 我把glFinish()調用之前glUseProgram()現在glFinish()需要的所有時間。 我將進一步查找性能泄漏。

我在這里做一個容易理解的猜測:您是否有機會與該着色器一起更改任何統一值或屬性綁定? NV GT120是相當老的GPU,如果那台計算機上的驅動程序也一樣古老,我也不會感到驚訝。 這就是難題:在某些情況下,着色器是在原位重新編譯的(即使在現代驅動程序中也是如此)。 如果發生像統一值更改這樣簡單的事情,舊的NVidia驅動程序特別容易重新着色器重新編譯。 也許這就是造成您打h的原因。

我發現glUseProgram調用本身並不需要很長時間,但是它正在等待前面的glReadPixels操作完成。

由於您的提示,我可以通過刪除glGetError和glClear調用來進一步提高性能。 謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM