You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在运行时使用Rust和SDL2更改窗口分辨率?

在Rust SDL2中实现动态切换窗口分辨率

要实现动态切换窗口分辨率且保持游戏状态完整,核心是在不重新创建窗口/画布的前提下修改窗口尺寸,同时保留游戏状态变量的持续性。以下是具体实现方案:

关键思路

  • 从画布(Canvas)中获取窗口的可变引用,无需重新创建窗口对象
  • 在事件循环中监听分辨率切换的触发事件(比如按键)
  • 调用窗口的set_size方法修改分辨率,游戏状态变量会自然保留

修改后的完整代码

extern crate sdl2;

use sdl2::pixels::Color;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use std::time::Duration;

pub fn main() {
    let sdl_context = sdl2::init().unwrap();
    let video_subsystem = sdl_context.video().unwrap();

    let window = video_subsystem.window("rust-sdl2 demo", 800, 600)
        .position_centered()
        .resizable() // 可选:允许窗口手动拖拽调整,不需要可移除
        .build()
        .unwrap();

    let mut canvas = window.into_canvas().build().unwrap();

    canvas.set_draw_color(Color::RGB(0, 255, 255));
    canvas.clear();
    canvas.present();
    let mut event_pump = sdl_context.event_pump().unwrap();
    let mut i = 0;
    'running: loop {
        i = (i + 1) % 255;
        canvas.set_draw_color(Color::RGB(i, 64, 255 - i));
        canvas.clear();
        for event in event_pump.poll_iter() {
            match event {
                Event::Quit {..} |
                Event::KeyDown { keycode: Some(Keycode::Escape), .. } => {
                    break 'running
                },
                // F1键切换到1280x720
                Event::KeyDown { keycode: Some(Keycode::F1), .. } => {
                    canvas.window_mut().set_size(1280, 720).unwrap();
                },
                // F2键切换回800x600
                Event::KeyDown { keycode: Some(Keycode::F2), .. } => {
                    canvas.window_mut().set_size(800, 600).unwrap();
                },
                _ => {}
            }
        }

        canvas.present();
        std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 60));
    }
}

核心代码解释

  • resizable():可选配置,允许用户手动拖拽窗口调整大小,若仅需要程序内触发切换可移除
  • canvas.window_mut():从画布中获取窗口的可变引用,这是动态修改尺寸的关键,无需重新创建窗口或画布
  • set_size(width, height):调用窗口的尺寸修改方法,传入目标分辨率即可完成切换,此操作不会影响游戏状态变量(如示例中的i)

注意事项

  • 修改分辨率后,SDL2会自动调整画布的渲染视口,无需额外手动配置
  • 若游戏中有基于窗口尺寸的逻辑(如UI布局、相机缩放),需要在分辨率切换后同步更新这些逻辑,确保渲染内容适配新尺寸

内容的提问来源于stack exchange,提问作者Tomo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:03:17