2010-02-08 15 views
6

VSync etkinleştirilmiş olsa bile engelleme olmayan bir SwapBuffers() yapmak için taşınabilir bir yol arıyorum. Başka bir deyişle, bir olay tarafından bildirilmek veya bir sonraki VSync'e kadar olan gecikmeyi bilmek mümkün mü?engellenmeyen SwapBuffers() VSync ile = on

+0

Bu, eğer mümkün ise, platforma özgü olacak. Bu yüzden lütfen en az etiketleyerek platformunuzu belirtin. – unwind

+0

Bu özelliği uygulamak için taşınabilir bir yol bulmak isterim (Win32/Linux/MacOSX) –

+0

Sonraki vsync'e olan gecikme size nasıl yardımcı olur? Takas çağrısı çağrısı, çağrı sırasında takası yapmaz. – Bahbar

cevap

0

İlk olarak, neden karenin başında SwapBuffers() öğesini çağırmıyorsunuz? OpenGL sadece ona attı komutların hiç uzağa çalışıyor iken Ya nasılsa

Render(); 
    Update(); //Update before swapping buffers 
    SwapBuffers(); 

için boru hattını değiştirmek, güncelleme mantığı her şeyi yapabilirsiniz. Aksi takdirde, bu sorunu çözmenin birkaç yolu vardır.

XNA'nın, ekranın şu anda taranmasını sağlayan ScanLine Özelliği olduğunu biliyorum. OpenGL'in bunu da ortaya çıkarır mı bilmiyorum, ama emin olmalıyım. (Sağ?)

Çok iş parçacıklı oluşturmayı kullanın. Pek çok modern motor, sadece render için bir iş parçacığı ayırır. Engellerse, sorun değil, ana parçayı rahatsız etmiyor. Alternatif olarak yeni bir iş parçacığı üzerinde giriş vb. Işlemek için daha kolay bir yol, bu grafik bağlamları ile ilgili karmaşıklıkları önler.

triple buffering'u kullanın. Üçlü arabelleğin kullanılması, 2 arka tampon belleğe sahip olduğunuz anlamına gelir. SwapBuffers'ı çağırdığınıza göre, ekran, yeni arabelleğinizi beklerken ön arabelleği taramaya ve sonraki kareyi oluşturmaya yönelik üçüncü arabelleğe devam edebilir. Tabii ki, zaten iki kare prerenderlediyseniz, SwapBuffers() engeller.

İlgili konular