我使用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太慢了?)以获取任何有价值的信息。 –