2015-09-27 79 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,所以,也許? –