2011-08-20 156 views
1

我在使用openGL與gtk(雖然gtkglext)和做動畫時遇到了放緩問題。許多OpenGL繪圖區域交換緩衝區放緩問題

本質上我有一個應用程序在GTK應用程序中使用OpenGL進行某些顯示。許多窗口可以一次打開(某些窗口可以有多個繪圖區域)。所以它可能一次在屏幕上說20-30個OpenGL繪圖區域。沒有一個繪圖太重,OpenGL的速度非常快。

我的問題來了,當所有這些顯示器動畫,它真的減慢了應用程序。經過對這個問題的大量研究後,我確定它是交換緩衝區調用openGL導致我的問題。在GTK中繪圖時,您可以在窗口小部件中繪製所有繪圖以顯示事件。因此,當您想要繪製繪圖區域窗口小部件時調用gtk_widget_queue_draw,然後當GTK處理其事件時,它將在需要繪製的所有窗口小部件上串行調用expose事件。問題出現在繪圖完成後,我需要調用交換緩衝區來在屏幕上繪製實際的OpenGL(由於雙緩衝)。此調用似乎阻止(因爲vysnc處於打開狀態),直到顯示器刷新。當屏幕上顯示3個繪圖區域時,這不是問題,但是當有一噸時,有大量交換緩衝區調用全部阻塞,並且真的會減慢應用程序,因爲每個交換緩衝區調用都在調用他們自己的揭露事件並沒有同步。

我的問題是有沒有辦法同步所有的交換緩衝區調用,所以沒有太多的阻塞。關閉vsync(本身是醜陋的,因爲它的OS/openGL實現特定)可以解決速度問題,但是之後會出現問題。我不確定多線程如何提供幫助,因爲我必須在GTK公開事件中執行交換緩衝區,以便繪圖與GTK同步,除非有我沒有想到的東西。

任何幫助,將不勝感激!

回答

1

如果你有20多個窗口,你期望什麼?每個人都在相同的時間進行驗證:屏幕刷新。在這段時間內,每個人都需要做一堆內存操作。所有在同一時間。當然會有放緩。除非你有20多個處理器,否則他們將不得不排在第一位。

真的,除了限制顯示給用戶的總帳窗口數量之外,您無能爲力。

+0

說每個OpenGL窗口只繪製一個三角形。阻塞線程SwapBuffers的V-Sync被調用是問題所在。 – datenwolf