我正在構建一個OpenGL應用程序。它與OpenGL唯一不方便的地方是它使用了少量(5個或更多)相當大(2000x2000及更大)的紋理。其餘的是非常默認的現代OpenGL 3.3的東西(FBO的,VBO的,IBO的,VOA的,着色器等)。由於這些紋理非常大,需要的位深度超過8位,因此我使用內部像素格式來減少內存(但是,將其更改爲簡單的內容並不會幫助(請參見下方))。現在,這裏是一個事物:完全相同的代碼,運行在Windows,Linux和MacOS上(我使用SDL作爲抽象層)。在同一硬件上(我的2011年末MacBook Pro 13「,Intel HD Graphics 3000 @ 1280x800),同樣的編譯器(clang -O3 -mavx
),Linux和macOS之間的性能差異是巨大的在macOS上,我的幀時間大約是30ms到80ms。然而,在Linux上,這是一個驚人的1ms到4ms。同樣的筆記本電腦,只是在不同的操作系統中重新啓動。縮短應用程序窗口大約600x400,在macOS上將幀時間降低到13ms因此,像素着色器/光柵化(我的着色器的確是非常複雜的)Linux與macOS,相同硬件的巨大OpenGL性能差異
我必須說我在macOS上有更好的幀時間(大約13ms到20ms)所以,在發現這些之後我越來越懷疑Apple可能會通過系統更新有意地「降級」英特爾HD Graphics 3000的圖形驅動程序,以將購買者推向b你的新產品。我必須說,我一直在考慮購買一臺新的筆記本電腦,但是自從我發現這一點以後,突然感到厭惡。
現在的問題是:你認爲在這裏會發生什麼?越野車司機?蘋果故意讓事情變慢?驅動程序中包含一個未優化的GLSL編譯器?或者,也許在應用程序中的OpenGL代碼中有一些不好的做法?驅動程序對非8位紋理格式的支持很普遍嗎?
我只是討厭這個應用程序在Linux中非常棒,在macOS中非常令人愉快。硬件能夠做得更好。
一些測試,如通過要求@BDL:
- 通過因子4在每一個降維的尺寸紋理(因而16次存儲器少,留給我們一個500×500的紋理,大約),不影響幀時間。
- 使用GL_RGB8或GL_SRGB8作爲內部格式不會影響幀時間。
- 減少很多着色器的複雜性確實有幫助:當我在片段着色器中刪除大量計算時,我可以將其平均降低到8ms。
我會嘗試一個GLSL着色器優化的明天:https://github.com/aras-p/glsl-optimizer 希望這有助於一點。
@NicolBolas我希望你停下來:) –
你應該使用儀器和/或OpenGL Profiler來描述你的應用程序。它使用了很多CPU時間嗎?它花了很多時間在紋理格式轉換?你也應該試一試你的代碼。你使用'GL_R11F_G11F_B10F'似乎是問題的可能原因。 –
難道你不能再縮小性能有問題的部分嗎?例如,是否使用較小的紋理幫助?降低着色器複雜性有助於嗎?在MacOS上,哪些OpenGL調用佔用了所有時間? – BDL