2015-09-27 60 views
3

我使用glium作为我的opengl绑定,但它不可能得到可靠的60 FPS。避免丢失帧glium

一个最小的测试用例是

#[macro_use] 
extern crate glium; 
extern crate clock_ticks; 

use glium::Surface; 
use glium::glutin; 

fn main() { 
    use glium::DisplayBuild; 

    let display = glutin::WindowBuilder::new() 
     .build_glium() 
     .unwrap(); 

    let frames = 60 * 5; 
    let trials = 3; 

    for _ in 0.. trials { 
     let start_ns = clock_ticks::precise_time_ns(); 
     for _ in 0..frames { 
      display.draw().finish().unwrap(); 
     } 

     let duration_ns = clock_ticks::precise_time_ns() - start_ns; 
     let duration_s = (duration_ns as f64)/1_000_000_000f64; 
     let fps = (frames as f64)/duration_s; 
     let dropped = (duration_s - (frames as f64 * (1f64/60f64)))/(1f64/60f64); 

     println!("{} frames in {:.6} seconds = {:.3} fps (estimated {:.1} frames dropped)", frames, duration_s, fps, dropped); 
    } 
} 

凡我所期望的60 FPS,但经常显示当我运行它(在OSX)59 FPS。 The project is available on github为便于编译和运行。

有没有什么办法可以调整glium,使它不会丢帧? OSX重写了vsync设置,因此无法在每帧之间等待vsync。

+0

我发现至少有两个潜在的测量不准确来源:1)浮点。 2)过程切换。我建议测量单个帧时间,而不是将它们中的大量数据平均。如果你实际上遇到了vsync的问题,当你的帧时间变化很大时,它应该会变得很明显。如果不是的话,那么你只是为了解决一个不存在的问题而为自己节省了很多挫折。 – 8bittree

+0

我分叉了项目并添加了一些代码来打印出帧时间,然后将其作为[拉请求在此](https://github.com/johshoff/minimal_glium/pulls)提交。我测试过的机器,Ubuntu和英特尔HD 5500报告的FPS通常略高于60。帧时间恰好在16.6ms + - 〜0.5ms左右 – 8bittree

+0

我没有在主循环中放入任何每帧信息,只是为了清楚地说明没有任何其他事情正在发生。不过,谢谢你的贡献。不幸的是,你的调试信息增加了太多延迟(我的终端iterm2太慢了?)以获取任何有价值的信息。 –

回答

1

是的,就像@ 8bitree一样,我怀疑你测量不正确,而不是真正的问题。在我的系统上,Debian:

[email protected]:~/tmp/guess$ cargo run 
    Running `target/debug/guess` 
300 frames in 4.427656 seconds = 67.756 fps (estimated -34.3 frames dropped) 
300 frames in 0.006892 seconds = 43529.834 fps (estimated -299.6 frames dropped) 
300 frames in 0.006522 seconds = 45997.412 fps (estimated -299.6 frames dropped) 
[email protected]:~/tmp/guess$ cargo run 
    Running `target/debug/guess` 
300 frames in 4.953447 seconds = 60.564 fps (estimated -2.8 frames dropped) 
300 frames in 4.999410 seconds = 60.007 fps (estimated -0.0 frames dropped) 
300 frames in 1.608712 seconds = 186.485 fps (estimated -203.5 frames dropped) 

所以,是的,有点奇怪。

+0

这是相当大的差异。它看起来像你在vsynced和不vsynced之间切换。我很想看看你的帧时间是多少。 – 8bittree

+0

如果主窗口失去焦点,我会看到每秒数千帧的相同行为。是这样吗? –

+0

@JohannesHoff我使用XMonad,所以,也许? –