#input #pixel #frame-rate #windowing #loops #winit #rendering

pix-win-loop

使用winit进行窗口管理,良好的输入处理和与帧率无关的游戏循环,全部封装在一个简洁的小包中。带有自定义渲染支持(pixelssoftbuffer),只需开启一个特性即可。

4个版本 (破坏性更新)

0.4.0 2024年1月4日
0.3.0 2024年1月3日
0.2.0 2023年12月23日
0.1.0 2023年12月23日

21渲染引擎

每月27次 下载

MIT 许可证

8KB
118

pix-win-loop

GPU像素缓冲区(使用pixels),窗口管理(使用winit),良好的输入处理和与帧率无关的游戏循环,全部封装在一个简洁的小包中。游戏循环基于https://gafferongames.com/post/fix_your_timestep

注意

如果需要使用其他渲染引擎,但想保留游戏循环,则该库中的'win-loop'部分已转移到(意外命名的)win-loop库。

pix-win-loop v0.3.0及更高版本使用win-loop,但仍然保留0.2 API。

小示例

use pix_win_loop::*;

struct Application;

impl App for Application {
    fn update(&mut self, ctx: &mut Context) -> Result<()> {
        if ctx.input.is_logical_key_pressed(NamedKey::Escape) {
            ctx.exit();
        }

        Ok(())
    }

    fn render(&mut self, pixels: &mut Pixels, _blending_factor: f64) -> Result<()> {
        // do rendering using pixels.

        let mut frame = pixels.frame_mut();

        // draw a 400x12 green line
        for pixel in frame.chunks_exact_mut(4).take(PIX_WIDTH as usize * 12) {
            pixel[1] = 255;
            pixel[3] = 255;
        }

        // you can use pixels.render_with() for custom rendering
        pixels.render()?;

        Ok(())
    }
}

const PIX_WIDTH: u32 = 400;
const PIX_HEIGHT: u32 = 300;

fn main() -> Result<()> {
    let window_builder = WindowBuilder::new()
        .with_title("win-pix-loop example")
        .with_inner_size(PhysicalSize::new(800, 600));

    // Pixel buffer will be scaled to the window size.
    // So e.g. this will result in 2x scaling.
    let pixel_buffer_size = PhysicalSize::new(PIX_WIDTH, PIX_HEIGHT);

    // Minimum time between updates.
    // See https://gafferongames.com/post/fix_your_timestep.
    let target_frame_time = Duration::from_secs_f32(1. / 120.); // 120 fps

    // Maximum time between updates.
    // The real time can still exceed this value.
    // See https://gafferongames.com/post/fix_your_timestep.
    let max_frame_time = Duration::from_secs_f32(0.1);

    pix_win_loop::start(window_builder, Application, pixel_buffer_size, target_frame_time, max_frame_time)
}

依赖项

~6–45MB
~731K SLoC