我正在试验一些rust代码,它是对Learn WGPU tutorial中显示的代码的轻微重构,包括添加一个统一的转换,以在固定的(像素)位置和大小绘制对象。
我注意到,当我调整我的窗口大小时,我的框会伸展、挤压和剧烈抖动。

拉伸/翘曲遵循增量的大小和方向,一旦完成大小调整,框始终位于其正确的位置和大小

GifCam的frame diff视图显示了移动过程中的拉伸程度

为了排除我对教程代码的任何更改,我克隆了repository,构建并运行了"tutorial6-uniforms",它显示了与缩放拉伸和挤压形状相同的行为。

将println添加到我的调整大小和呈现函数中(并禁用MainEventsCleared上的重绘),甚至可以显示成对的调整大小事件和重绘
redraw called PhysicalSize { width: 800, height: 600 } // initial draw
resize called PhysicalSize { width: 799, height: 600 } // resize begins
redraw called PhysicalSize { width: 799, height: 600 }
resize called PhysicalSize { width: 774, height: 589 }
redraw called PhysicalSize { width: 774, height: 589 }这一切都让我相信在幕后发生了一些事情,也许在重绘完成之前,框架首先被拉伸以匹配窗口的新大小?有没有办法防止这种情况发生?当屏幕上有很多元素时,尤其是文本,这种效果就会变得非常不和谐。更不用说大多数应用程序都不会受到这方面的影响,所以它看起来既不专业又丑陋。
这是我的事件循环,我省略了其他代码来降低文章大小,但如果有助于解决问题,我会添加更多代码,或者参考教程中的code here。
event_loop.run(move |event, _, control_flow| {
match event {
Event::WindowEvent {
ref event,
window_id,
} if window_id == window.id() => {
match event {
// ...
WindowEvent::Resized(physical_size) => {
renderer.resize(*physical_size);
},
_ => {}
}
},
Event::RedrawRequested(_) => {
match renderer.render() {
Ok(_) => {},
Err(e) => eprintln!("{:?}", e),
}
},
// no change in observed resizing behavior with or without
/*Event::MainEventsCleared => {
window.request_redraw();
},*/
// ...
_ => {}
}
})发布于 2021-03-18 18:20:28
我相信这是一个winit issue,它将视图设置为自动调整大小,并且在操作系统重新绘制调整大小的窗口之前不让应用程序有机会重新绘制。我还没有找到一个好的解决方法,所以我想唯一的途径就是让某人潜入winit代码。
https://stackoverflow.com/questions/65947880
复制相似问题