由於今天的卡片似乎保留了渲染命令列表,並且只在調用glFlush
或glFinish
時才刷新,是否真的需要雙緩衝?我在Linux上開發的OpenGL遊戲(ATI Mobility radeon卡)與SDL/OpenGL實際上閃爍較少,當SDL_GL_swapbuffers()
被替換爲glFinish()
和SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,0)
在init代碼中時。這是我的卡片的特殊情況還是所有卡片上都有這種情況?是否需要雙緩衝
編輯:我發現原因是KWin。看起來像datenwolf說的那樣,沒有同步的合成是原因。當我關閉KWin合成時,遊戲無需任何源代碼補丁即可正常工作
提到的帖子已超過6歲。 X11是否還缺少同步方案?那麼Windows呢? –
除了datenwolf的解釋,你應該注意到你通常不會調用'glFlush'或'glFinish',除非在一些非常非常罕見的特殊情況下。 'glFinish'什麼也不做('wgl | glx)SwapBuffers'沒有做過(假設vsync被啓用),'glFlush'只刷新排隊的命令並且告訴服務器開始處理它們,這在最好的情況(但是是無用的調用和上下文切換),並且在最壞的情況下導致更差的性能(由於GPU資源的次優調度)。 – Damon
理想情況下,您會希望儘可能多地在GL上執行命令,並儘可能擴展依賴關係(例如,如果使用紋理,首先發送命令來定義紋理圖像,設置紋理狀態等,然後發送一些執行其他操作的命令,然後只繪製使用此紋理的東西)。這可以確保:a)由於依賴關係,命令流中的命令不太可能被阻止; b)如果隊列中的命令停頓,驅動程序可以安排其他一些命令來利用GPU(OpenCL或其他程序?)。 – Damon