Glium中帧率被锁定为61FPS的问题求助
Glium中帧率被锁定为61FPS的问题求助
嘿,我来帮你搞定这个帧率锁死的问题!
首先,你看到的61FPS大概率是**垂直同步(VSync)**加上计时误差导致的。哪怕换了显示器,Glium默认会开启VSync,它会强制你的帧率和显示器刷新率同步(一般是60Hz左右)。而1000ms里统计到61帧,只是因为你的计时窗口刚好多包含了一帧,实际帧率还是被VSync限制在和显示器一致的水平。
接下来给你几个具体的解决方向:
1. 手动关闭Glium的垂直同步
这是最直接的解决方案,你需要在创建Display的时候,明确告诉Glium不要开启VSync。找到你初始化display的代码,修改成类似这样:
use glium::glutin::{ContextBuilder, WindowBuilder}; use glium::glutin::surface::SwapInterval; // 保持你原来的窗口设置 let window_builder = WindowBuilder::new().with_title("你的应用窗口"); // 关键:在上下文构建器中关闭垂直同步 let context_builder = ContextBuilder::new() .with_swap_interval(SwapInterval::Never); // 用修改后的配置创建Display let display = glium::Display::new(window_builder, context_builder, &event_loop).unwrap();
关闭VSync后,你的帧率应该会立刻解锁,能跑到显卡支持的上限(比如144FPS甚至更高,取决于你的硬件)。
2. 检查显卡驱动的全局VSync设置
如果关闭Glium的VSync后还是没效果,那可能是你的显卡驱动强制开启了全局VSync。这时候需要打开显卡控制面板(NVIDIA控制面板/AMD Radeon软件/Intel显卡设置),找到“垂直同步”选项,改成“由应用程序决定”或者直接关闭全局VSync。
3. 优化你的帧率统计代码
你当前的统计方式是每1000ms数一次帧数,这种方式很容易因为计时起点的偏差出现±1的误差。可以改成计算平均帧率,结果会更准确:
// 替换你原来的帧计数器变量 use std::time::Instant; let mut frame_times = Vec::new(); let mut last_frame_time = Instant::now(); // 在RedrawRequested分支里替换原来的统计代码: let current_frame = Instant::now(); let frame_duration = current_frame.duration_since(last_frame_time); frame_times.push(frame_duration); last_frame_time = current_frame; // 累计时间超过1秒时计算平均帧率 let total_nanos: u128 = frame_times.iter().map(|d| d.as_nanos()).sum(); if total_nanos >= 1_000_000_000 { let avg_frame_time = total_nanos as f64 / frame_times.len() as f64; let fps = 1_000_000_000.0 / avg_frame_time; println!("{:.1} FPS", fps); // 显示带一位小数的精准帧率 frame_times.clear(); }
这种方式会计算每帧的平均耗时,再换算成帧率,能避免之前的整数计数误差。
额外排查点
如果关闭VSync后帧率还是上不去,那就要检查代码里有没有阻塞操作(比如在渲染线程里做了IO、计算量大的同步任务),或者Winit的事件循环有没有被其他逻辑限制。不过从你贴的代码来看,这部分应该没问题,优先排查VSync的问题就好。
你先试试关闭VSync,有结果了随时回来反馈哦!




