最近,我一直在跟踪经典的Vulkan教程,并成功地启用了验证层特性并加载了VK_EXT_debug_utils扩展。当我在实例创建期间强制错误时,我确认了后者,并按预期调用了已注册的回调。最后,我想在清理期间测试错误检测,并按照教程的建议进行注释,销毁调试实用程序信使句柄。令我惊讶的是,没有报告任何错误。
最后,我能够将这个问题追溯到winit和run方法。该方法劫持主线程的方式显然使Vulkan调试实用程序无法在关闭时报告任何诊断。出于测试目的,我将对EventLoop::run的调用替换为EventLoop::run_return,后者返回控制流。对于后者,当应用程序退出时,我得到了有关扩展泄漏的预期错误消息。
我想知道如何使EventLoop::run方法的使用与调试实用程序相协调。
发布于 2021-05-11 20:23:43
经过进一步的尝试和错误,通过查阅文档,我终于找到了解决这个问题的方法,这个问题仍然困扰着我,因为它在winit的实现细节方面表现很糟糕。
EventLoop::run方法的文档提到
没有传递给此函数的任何值都不会被删除。
这意味着我包装了方法调用的结构不会被删除,因此Vulkan实例没有被销毁,因此没有触发任何调试实用程序。
由于我的事件循环目前相当简洁,因为它不包含任何内容,所以我不得不将self传递到闭包中,如下所示:
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,
_ => (),
}
});
}https://stackoverflow.com/questions/67490762
复制相似问题