首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在glium中设置帧重绘速率?

在glium中设置帧重绘速率?
EN

Stack Overflow用户
提问于 2020-05-02 00:35:28
回答 1查看 743关注 0票数 0

我正在尝试用rust中的glium来做一个游戏循环。我的目标是让屏幕每秒重绘60次。使用我当前的事件循环代码,只有当窗口大小改变时,框架才会被重新绘制。我在明胶文档中读到,我需要在某个地方调用request_redraw,但我不确定如何调用/在哪里调用。这是我到目前为止的代码:

代码语言:javascript
复制
event_loop.run(move |event, _target, control_flow| match event {
    Event::LoopDestroyed => return,
    Event::WindowEvent {
        window_id: _window_id,
        event: winevent,
    } => match winevent {
        WindowEvent::Resized(physical_size) => display.gl_window().resize(physical_size),
        WindowEvent::CloseRequested => {
            *control_flow = ControlFlow::Exit;
        }
        _ => {}
    },
    Event::RedrawRequested(_window_id) => {
        let mut target = display.draw();
        target.clear_color_srgb(rng.gen(), rng.gen(), rng.gen(), 1.0);
        target.finish().unwrap();
    }
    _ => {}
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-02 01:19:40

我以前没有用过glium (我已经直接用Vulkano做过一些图形应用程序了)。然而,仔细阅读API,您似乎可以通过一系列API从winit获得窗口句柄。我在下面的代码中概述了它们。像下面这样的东西应该对你有用。关键是从winit访问Window句柄。滚动浏览Window应用程序接口,您将看到以下内容:request_redraw。然后,您可以像这样在事件处理程序周围插入游戏循环逻辑:

代码语言:javascript
复制
use std::time::Instant;
use glium::Display;
use winit::event_loop::{EventLoop, ControlFlow};
use winit::event::{Event, WindowEvent};
use winit::window::Window;

const TARGET_FPS: u64 = 60;

/* ... some function for main loop ... */

let display: Display = ... /* glium Display instance */

event_loop.run(move |event, _target, control_flow| {
    let start_time = Instant::now();
    match event {
        Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => {
            *control_flow = ControlFlow::Exit;
        },
        ...
    /*
     * Process events here
     */
    }
    match *control_flow {
        ControlFlow::Exit => (),
        _ => {
            /*
             * Grab window handle from the display (untested - based on API)
             */
            display.gl_window().window().request_redraw();
            /*
             * Below logic to attempt hitting TARGET_FPS.
             * Basically, sleep for the rest of our milliseconds
             */
            let elapsed_time = Instant::now().duration_since(start_time).as_millis() as u64;

            let wait_millis = match 1000 / TARGET_FPS >= elapsed_time {
                true => 1000 / TARGET_FPS - elapsed_time,
                false => 0
            };
            let new_inst = start_time + std::time::Duration::from_millis(wait_millis);
            *control_flow = ControlFlow::WaitUntil(new_inst);
        }
    }
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61546655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档