我使用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。
我發現至少有兩個潛在的測量不準確來源:1)浮點。 2)過程切換。我建議測量單個幀時間,而不是將它們中的大量數據平均。如果你實際上遇到了vsync的問題,當你的幀時間變化很大時,它應該會變得很明顯。如果不是的話,那麼你只是爲了解決一個不存在的問題而爲自己節省了很多挫折。 – 8bittree
我分叉了項目並添加了一些代碼來打印出幀時間,然後將其作爲[拉請求在此](https://github.com/johshoff/minimal_glium/pulls)提交。我測試過的機器,Ubuntu和英特爾HD 5500報告的FPS通常略高於60。幀時間恰好在16.6ms + - 〜0.5ms左右 – 8bittree
我沒有在主循環中放入任何每幀信息,只是爲了清楚地說明沒有任何其他事情正在發生。不過,謝謝你的貢獻。不幸的是,你的調試信息增加了太多延遲(我的終端iterm2太慢了?)以獲取任何有價值的信息。 –