Scratchings from whiteboard: Main application loop: for( ;; ) { CameraGroup::sync(); preCull Traversal; CameraGroup::frame(); } CameraGroup::frame() { Barrier.release(); } CameraGroup::sync() { Barrier.wait(); } Two possible Camera implementations: A) ====== Camera::thread() { for( ;; ) { Barrier.wait(); cull(); SVR(); // Sync Vertical Retrace draw(); Barrier.release(); swapbuffers(); } } B) ==== Threaded Cull Camera::thread() { for( ;; ) { Barrier.wait(); CullDrawBarrier.release(); CullDrawBarrier.wait(); swap scene view buffers; Barrier.release(); } } Cull::thread() { for( ;; ) { CullDrawBarrier.wait(); cull(); CullDrawBarrier.release(); } } Draw::thread() { for( ;; ) { CullDrawBarrier.wait(); draw(); CullDrawBarrier.release(); } }