wgpu-rs运行触发panic:`Texture[1] does not exist` 如何解决?
问题原因
- 核心原因是
SurfaceFrame的生命周期提前结束,导致其持有的屏幕纹理被提前释放。你当前的代码里直接通过链式调用self.surface.get_current_frame()?.output.texture.create_view(...),没有将get_current_frame()返回的SurfaceFrame实例绑定到变量持有,链式调用结束后临时的SurfaceFrame对象会被自动销毁,其内部的纹理资源也会被回收,后续创建的TextureView就指向了已不存在的纹理资源,触发panic。 - 补充:你代码中的
begin_render_pas存在笔误,正确拼写应为begin_render_pass,该问题会导致编译失败,不属于本次运行时panic的诱因。
修复方案
修改代码,将SurfaceFrame绑定到变量持有,保证在命令提交完成前SurfaceFrame不会被销毁,参考修改后的代码:
// 先获取SurfaceFrame并持有,避免提前释放 let frame = self.surface.get_current_frame()?; let texture_view = frame .output .texture .create_view(&wgpu::TextureViewDescriptor::default()); // 再创建命令编码器(顺序也可以调整,只要保证frame在提交前有效即可) let mut encoder = self.device.create_command_encoder(...); let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { color_attachments: &[wgpu::RenderPassColorAttachment { view: &texture_view, resolve_target: None, ops: wgpu::Operations { load: wgpu::LoadOp::Clear(wgpu::Color::BLACK), store: true, } }], depth_stencil_attachment: None, }); render_pass.set_/* pipeline, bind_group, vertex_buffer, index_buffer */(...); render_pass.draw_indexed(...); // 手动drop render_pass,避免encoder.finish()时出现资源借用冲突 drop(render_pass); self.queue.submit(std::iter::once(encoder.finish())); // frame变量在此处作用域结束才会被销毁,保证纹理在整个渲染流程中有效
内容的提问来源于stack exchange,提问作者doliphin
相关产品推荐
相关产品推荐

