首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用军团ECS的多个可变查询

使用军团ECS的多个可变查询
EN

Stack Overflow用户
提问于 2022-01-20 01:24:34
回答 1查看 174关注 0票数 0

我正在使用军团ECS,并试图使用多个可变查询,并遇到一些借用检查器约束。

我基本上希望通过与所有其他组件进行比较来更新组件的状态。

本质上-如果组件与另一个组件相邻,则使其为蓝色。

代码语言:javascript
复制
let components = <&Component>::query()
  .iter(world)
  .collect();

<&Component>::query()
  .iter_mut(world)
  .for_each(|component| {
     // for each c in components 
     // make component blue if c is adjacent to this component
   })

以上错误为cannot borrow *ecs as mutable more than once at a time

代码语言:javascript
复制
    |
128 |             .iter(&ecs)
    |                   ---- immutable borrow occurs here
...
134 |             .iter_mut(&mut ecs)
    |                       ^^^^^^^^ mutable borrow occurs here
135 |             .for_each(|(_, fov)| {
136 |                 let fovs: HashSet<Point> = components
    |                                            --- immutable borrow later captured here by closure

还有别的方法可以做到这一点吗?我认为克隆最初的集合会使我与World/ecs脱钩。但是,即使有了克隆,迭代组件集合也是不可变的借用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-20 15:26:52

问题是您的components向量是一个包含对Component的引用的向量,它借用了world,这意味着您不能在以后编辑组件时随意借用它。

您可以通过几种方法解决这一问题:

  • 在创建compontents向量时克隆组件。很简单,但一开始需要更多的allocation.
  • Iterate来处理组件,并为更改保留一个缓冲区,然后应用这些更改。flushing.
  • Iterate可以对此有所帮助--您甚至可以将其添加到系统中,而军团将负责创建和使用CommandBuffer over Entities,可能会使用组件过滤器(如果这样可以锁定其筛选所使用的存储),并使用world.entry[_mut]一次访问一个组件。不需要分配,但可能有更糟的performance.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70779773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档