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ı?
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
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 ... –