egui中检查图片加载状态的多种方法及图片状态查询API疑问
egui中检查图片加载状态的多种方法及图片状态查询API疑问
我来针对你的问题详细解答下:
1. 当前方法的实用性及其他检查加载状态的方式
你的当前实现是可行且务实的——load_for_size返回的TexturePoll确实是egui原生提供的用来检查图片加载状态的标准方式,能直接拿到Pending/Ready/Failed状态,逻辑清晰且符合egui的设计思路。
不过如果想要更简洁的实现,还有这些替代方案:
- 封装状态检查逻辑:把状态判断的代码封装成工具函数,避免重复编写临时变量和匹配逻辑,比如:
之后你只需要调用这个函数就能直接获取加载状态,不用每次都写重复代码。fn is_image_loaded(ctx: &egui::Context, uri: &str, size: egui::Vec2) -> bool { let img = egui::Image::from_uri(uri.to_string()) .max_height(size.y) .max_width(size.x); matches!(img.load_for_size(ctx, size), Ok(egui::load::TexturePoll::Ready(_))) } - 自定义图片加载器:如果需要全局统一管理加载状态,可以实现
egui::Loadtrait,自己维护一个全局的加载状态映射表(比如HashMap<String, LoadingState>),这样所有图片的加载状态都能在一个地方查询,不用每次触发加载才能检查。 - 除了
TexturePoll/ImagePoll,egui目前没有其他原生的公开API直接检查图片加载状态,因为加载逻辑是和load_for_size这类触发加载的操作绑定的。
2. 通过URI查询图片状态的可能性
你说得很对:egui确实通过URI作为图片缓存的唯一标识,ctx.forget_image(uri)能通过URI清理图片,说明内部是用URI索引图片资源的。但截至egui的当前稳定版本,并没有公开的ctx.info_image(uri)这类API——因为egui的TextureManager(管理图片缓存的核心组件)的内部状态是私有的,没有对外暴露查询接口。
不过我们可以通过以下方式模拟这个需求:
- 自己维护全局状态映射:在你的App状态中定义一个
HashMap<String, egui::load::TexturePoll>(或者自定义的ImageLoadingState枚举),每次调用load_for_size时,将对应的URI和状态存入这个Map。之后你就可以随时通过URI查询状态,相当于自己实现了info_image的功能。同时,当你调用ctx.forget_image(uri)时,记得同步从这个Map中移除对应的条目,保持状态一致。 - 利用egui的全局内存存储:如果不想把状态存在App结构体里,可以用
ctx.memory().data来存储全局状态。比如定义一个自定义的键类型:
这种方式可以跨组件访问图片状态,不用传递App状态。#[derive(Clone, PartialEq, Eq, Hash)] struct ImageStatusKey(String); // 存储状态 ctx.memory().data.insert_permanent(ImageStatusKey(uri.to_string()), loading_state); // 查询状态 let status = ctx.memory().data.get::<ImageStatusKey>(&ImageStatusKey(uri.to_string()));
针对你的核心需求的总结
如果想要“不生成额外变量、不初始化时本地获取,直接从context查状态”,egui原生做不到,但你可以基于ctx.memory().data自己实现一个全局的图片状态跟踪系统——这和egui内部的缓存逻辑对齐,既可以通过URI快速查询状态,又不用重复编写加载检查的代码。
备注:内容来源于stack exchange,提问作者black_hole_sun
相关产品推荐
相关产品推荐

