簡體   English   中英

OpenGL異步渲染場景需要花費幾秒鍾

[英]OpenGL asynchronous render of scene that takes several seconds

我已經使用wxWidgets和OpenGL實現了Mandelbrot分形生成器。 計算是在片段着色器內部執行的,而我正在使用wxGLCanvas小部件顯示結果。 它運行良好,但是當我要執行高分辨率導出時,線程鎖定了幾秒鍾,這凍結了UI。

最初,我嘗試將所有渲染代碼(和上下文創建)移到一個單獨的渲染線程中,但是我發現,鎖定的不僅僅是渲染線程,而是所有線程。 這可以通過在執行僅在循環中將消息打印到stdout的渲染之前生成一個新線程來容易地演示。 在凍結之前,它將打印多達1條消息,然后在渲染完成后恢復。

為了執行文件導出,我首先渲染為紋理,然后使用glGetTexImage將像素讀入主存儲器。 渲染與您期望的異步進行,但是glGetTexImage函數將阻止(再次達到預期)。 因此,我嘗試將glFenceSync與glGetSynciv結合使用,僅在達到圍欄指示已完成渲染時才調用glGetTexImage。

我可以確認繪圖調用立即返回,但是當我返回到wxWidgets事件循環以等待渲染完成時,應用程序中的所有線程都將凍結。 我認為wxWidgets正在進行強制進行同步的OpenGL調用(wxGLCanvas中可能有問題)-我相當確定這不是我的代碼中的問題。

我不確定為什么所有線程都阻塞glGetTexImage調用,而不僅僅是渲染線程。 我以為這可能是我的設置(硬件,驅動程序,操作系統等)的怪癖,但在完全不同的平台上卻得到了相同的結果。

我能想到的唯一剩下的選擇是使用自己的OpenGL上下文在另一個進程中進行導出渲染。 如果仍要使用wxGLCanvas設置上下文,則可能需要在屏幕上顯示一個可見窗口,這並不理想。 同樣,如果用戶在渲染過程中嘗試關閉窗口,它將無響應。

有任何想法嗎?

與其說是解決方案,不如說是一種解決方法(由注釋中的derhass建議)是將渲染分為幾個較小的渲染。 我將圖像繪制成水平條紋,每個條紋高10像素,並在每個條紋之間調用wxSafeYield(),以使UI保持一定的響應速度(如果繪制時間太長,用戶可以中止渲染)。

另一個好處是,GPU過載的危險較小。 在執行此操作之前,我曾經啟動過長時間的渲染,導致顯示器關閉,因此必須進行強制重啟。

暫無
暫無

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

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