2012-04-06 18 views
6

Bir Windows uygulamasında, birden çok OpenGL penceresini aynı anda açarım. İdeal olarak, bunların her birinin ekran tazeleme ile senkronize 60 fps'de çekilmesini istiyorum.Birden çok OpenGL penceresini vsync ile eşitleme

Her bir oluşturma bağlamında, vsync özelliğini açmak için wglSwapIntervalEXT(1) numaralı telefonu arıyorum. Her pencere, çerçeveyi çizen ve ardından güncellemek için SwapBuffers numaralı telefonu arayarak kendi ekran parçasına sahiptir.

Pencerelerin birbirleriyle 'kavga ettikleri' ortaya çıkıyor: SwapBuffers çağrıları senkronize ediliyor ve ayrı iş parçacıklarına sahip olsalar bile birbirlerini bekliyorlar. Her pencerenin çerçeve-kare zamanını ölçüyorum ve iki pencere ile, bu, 30 ila 3, üç ila 20 fps, vs düşer.

ile eşitsizliği kapatırsam, 60 kaç tane pencere açsam gitsin. Ama bir pencere açıkken, bu, vsync'nin açık olduğu kadar yumuşak değil.

OpenGL ile ne istediğimi gerçekleştirmenin bir yolu var mı?

+0

Sorunu düşünüyorsanız, bunların tümünü yenileme hızıyla senkronize ediyorsanız birbirleriyle senkronize olmaları gerektiğini anlayacaksınız. Gördüğünüz her pencere için benzersiz bir yenileme etkinliği yoktur. Düşünebildiğim tek çözüm (neredeyse kesinlikle bir başlangıç ​​değil), bir pencere kullanmak ve içinde kendi pencere yöneticinizi görüntülemek. – Robinson

+0

SwapBuffers arabelleklerin değiştirilmesinin gerekip gerekmediğini bildirirse, hemen geri dönebilir (yeni arka tampon yazılana kadar bu işlem engellenir). Ekran sürücüsünün sahip olduğu ayrı bir iş parçacığı, daha sonra eşzamanlamayı bekleyebilir ve doğru anda takas edilmesi gereken işaretlenmiş tüm arabellekleri değiştirebilir. Ancak, görünüşte bu nasıl iş değil ... –

cevap

0

Çıktı aygıtını elde edebileceksiniz ve WaitForVBlank işlevini iş parçacığındaki bir döngüde kullanabilirsiniz. Bu, ilgilendiğiniz her pencere için iletileri veya sinyal olaylarını yayınlayabilir.

+0

Sorun şu ki diğer OpenGL pencereleri doğrudan kontrol etmem. –

1

Linux'ta, çeşitli iş parçacıklarından video işlevlerini çağırması nedeniyle, uygulamalarda birçok garip davranış oluştu.

Bu sorunları, uygulamanın başlamasından bu yana görüntülenmek, pencere oluşturmak, glontext oluşturmak vb. Için tek bir iş parçacığı kullanarak ve bu iş parçacığı ile diğerleri arasında veri paylaşımı için semaforlar ve sıralar kullanarak çözdüm.