尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Rerun ClearIsRecursive 组件详解:清除操作的递归语义、数据编码与源码实现

Rerun ClearIsRecursive 组件详解:清除操作的递归语义、数据编码与源码实现 Rerun ClearIsRecursive 组件详解清除操作的递归语义、数据编码与源码实现【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerunClearIsRecursive是 Rerun 数据模型中用于控制清除Clear操作作用范围的布尔组件它决定一次清除是仅作用于目标实体本身flat还是连同其所有递归子实体一并清除recursive。本文以 clear_is_recursive.md 为核心结合Clear原语Archetype的文档与仓库源码讲解该组件的语义、编码方式、默认行为、实际用法与底层实现依据帮助你准确使用 Rerun 的清除机制管理实体生命周期。组件定位ClearIsRecursive 是什么ClearIsRecursive是 Rerun 类型体系中的一个组件Component官方定义为Configures how a clear operation should behave - recursive or not.配置一次清除操作的行为方式——递归或不递归。它不单独使用而是作为Clear原语唯一必需字段存在。从 Clear 原语文档 的字段定义可以看到必需字段Requiredis_recursiveClearIsRecursive在 Rust 实现中Clear结构体同样只有这一个字段archetypes/clear.rspub struct Clear { pub is_recursive: OptionSerializedComponentBatch, }也就是说ClearIsRecursive的取值直接决定了整个Clear原语的行为二者是一一对应的关系。数据类型与编码Bool 编码、Boolean Arrow 类型ClearIsRecursive在数据层极其简单本质就是一个布尔值。参考文档给出了两层类型信息层级类型Rerun 编码EncodingBoolArrow 数据类型Arrow DatatypeBooleanBool是 Rerun 中单个布尔值的基础编码类型除ClearIsRecursive外还被Interactive、IsKeyframe、ShowLabels、Visible等组件共用见 bool.md。Rust 侧的组件定义components/clear_is_recursive.rs印证了这一点/// **Component**: Configures how a clear operation should behave - recursive or not. #[derive(Clone, Debug, Copy, PartialEq, Eq, ::re_byte_size::SizeBytes)] pub struct ClearIsRecursive( /// If true, also clears all recursive children entities. pub crate::encodings::Bool, );该组件的完整类型名为rerun.components.ClearIsRecursive并实现了WrapperComponent编码为crate::encodings::Bool。因此无论通过 Rust、C 还是 Python SDK 写入最终落到 Arrow 数据中的都是Boolean数组。默认行为非递归flat且是有意为之ClearIsRecursive的默认值是false即默认清除仅作用于目标实体本身。这一默认并非随意选择components/clear_is_recursive_ext.rs 中的实现注释说明了设计考量impl Default for ClearIsRecursive { #[inline] fn default() - Self { // Clear only the element itself by default since this is less intrusive. // (Clearing recursively can be emulated with many clears, but the reverse is not true.) Self(false.into()) } }要点是默认只清除元素自身因为这种操作侵入性更小递归清除可以用多次 flat 清除模拟但反过来不成立。换句话说flat 是更基础、更可控的原子操作recursive 则是它的便捷扩展。Clear 原语的行为语义清除在查询中如何生效要真正理解ClearIsRecursive的价值需要先明确Clear原语本身的行为语义清空实体的全部组件Clear的作用是清空一个实体的所有组件。对 latest-at 查询Clear的存在意味着对给定路径的组件做 latest-at 查询时不会返回在清除之前记录的任何组件清除之后记录的组件不受影响。对 range 查询范围查询只要包含清除之前的时间点仍会返回该路径下清除之前的组件。因此在实际使用中开启可见时间范围visible time ranges时清除往往是无效的。例外标量图Scalar plots标量图会跟踪清除事件并用它们来表示数据中的空洞即不连续的折线。在这些语义之上is_recursive决定清除的影响半径为true时除了目标实体还会清掉该实体的所有递归子实体的组件。实际使用flat() 与 recursive() 两种构造方式在 Rust 侧Clear提供了两个语义化的构造函数archetypes/clear_ext.rsClear::flat()—— 返回非递归清除ClearIsRecursive(false)Clear::recursive()—— 返回递归清除即除了实体本身还清除其所有递归子实体的全部组件。参考 archetypes/clear.rs 中的官方示例Flat 版本先记录一组 3D 箭头再逐个以Clear::flat()清除它们use rerun::external::glam; fn main() - Result(), Boxdyn std::error::Error { let rec rerun::RecordingStreamBuilder::new(rerun_example_clear).spawn()?; #[rustfmt::skip] let (vectors, origins, colors) ( [glam::Vec3::X, glam::Vec3::NEG_Y, glam::Vec3::NEG_X, glam::Vec3::Y], [(-0.5, 0.5, 0.0), (0.5, 0.5, 0.0), (0.5, -0.5, 0.0), (-0.5, -0.5, 0.0)], [(200, 0, 0), (0, 200, 0), (0, 0, 200), (200, 0, 200)], ); // Log a handful of arrows. for (i, (vector, origin, color)) in itertools::izip!(vectors, origins, colors).enumerate() { rec.log( format!(arrows/{i}), rerun::Arrows3D::from_vectors([vector]) .with_origins([origin]) .with_colors([rerun::Color::from_rgb(color.0, color.1, color.2)]), )?; } // Now clear them, one by one on each tick. for i in 0..vectors.len() { rec.log(format!(arrows/{i}), rerun::Clear::flat())?; } Ok(()) }若希望一次清除整棵实体子树例如清掉arrows下所有子实体则改用Clear::recursive()即可。从 archetypes/clear.rs 的实现看还可以通过Clear::new(is_recursive)或链式方法with_is_recursive(...)显式指定取值批量场景下可用with_many_is_recursive(...)配合columns()实现列式发送send_columns。在 Python SDK 中Clear原语同样暴露is_recursive构造参数类型为encodings.BoolLike | None见 rerun_py/rerun_sdk/rerun/archetypes/clear.py并在内部经components.ClearIsRecursiveBatch完成组件批次的序列化。源码与测试验证roundtrip 往返一致性仓库中的单元测试直接验证了ClearIsRecursive两种取值与Clear构造方式的对应关系。re_sdk_types/tests/types/clear.rs 的 roundtrip 测试将Clear { is_recursive: ClearIsRecursive(true) }与Clear::recursive()对应Clear { is_recursive: ClearIsRecursive(false) }与Clear::flat()对应并依次执行to_arrow()序列化与from_arrow()反序列化断言往返前后数据完全一致。这说明无论通过哪种构造方式最终都落为Clear:is_recursive描述符ComponentDescriptor组件类型rerun.components.ClearIsRecursive见 archetypes/clear.rs下的Boolean列语义与数据格式严格一一对应。使用注意事项综合文档与源码使用ClearIsRecursive即Clear的is_recursive字段时有几点值得留意默认是 flat不传is_recursive时清除仅作用于目标实体行为可预期、侵入性小需要整树清理时再显式使用 recursive。visible time ranges 下清除无效范围查询包含清除前的时间点时仍会返回旧组件标量图是唯一会跟踪清除并呈现数据空洞不连续折线的场景。递归清除适合成组清理当实体按层级组织如arrows/0、arrows/1…时recursive可一次清掉整组但多次 flat 清除也能达到等价效果二者在数据层面只是Boolean取值的差异。通过本文对 ClearIsRecursive 组件文档、Clear 原语文档 与对应源码的对照你已经掌握该组件在 Rerun 数据模型中的位置、编码格式、默认行为与两种实战用法可在自己的可视化管线中正确规划清除策略。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表