首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在关机时抑制Vulkan验证输出的winit事件循环

在关机时抑制Vulkan验证输出的winit事件循环
EN

Stack Overflow用户
提问于 2021-05-11 16:24:48
回答 1查看 214关注 0票数 1

最近,我一直在跟踪经典的Vulkan教程,并成功地启用了验证层特性并加载了VK_EXT_debug_utils扩展。当我在实例创建期间强制错误时,我确认了后者,并按预期调用了已注册的回调。最后,我想在清理期间测试错误检测,并按照教程的建议进行注释,销毁调试实用程序信使句柄。令我惊讶的是,没有报告任何错误。

最后,我能够将这个问题追溯到winitrun方法。该方法劫持主线程的方式显然使Vulkan调试实用程序无法在关闭时报告任何诊断。出于测试目的,我将对EventLoop::run的调用替换为EventLoop::run_return,后者返回控制流。对于后者,当应用程序退出时,我得到了有关扩展泄漏的预期错误消息。

我想知道如何使EventLoop::run方法的使用与调试实用程序相协调。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-11 20:23:43

经过进一步的尝试和错误,通过查阅文档,我终于找到了解决这个问题的方法,这个问题仍然困扰着我,因为它在winit的实现细节方面表现很糟糕。

EventLoop::run方法的文档提到

没有传递给此函数的任何值都不会被删除。

这意味着我包装了方法调用的结构不会被删除,因此Vulkan实例没有被销毁,因此没有触发任何调试实用程序。

由于我的事件循环目前相当简洁,因为它不包含任何内容,所以我不得不将self传递到闭包中,如下所示:

代码语言:javascript
复制
fn run(mut self) {
    self.event_loop
        .take()
        .unwrap()
        .run(move |event, _, control_flow| {
            *control_flow = ControlFlow::Poll;

            let Self { .. } = self;

            match event {
                Event::WindowEvent {
                    event: WindowEvent::CloseRequested,
                    ..
                } => *control_flow = ControlFlow::Exit,
                _ => (),
            }
        });
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67490762

复制
相关文章

相似问题

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