EnTT框架:能否无需循环过滤视图项?循环性能是否可忽略?
EnTT视图初始化时的精确筛选问题
EnTT是一款ECS框架,官方示例里创建视图的写法如下:
auto card_lot = registry.view<const Card, const Owner>();
这个视图会返回所有同时拥有Card和Owner组件的实体(注:EnTT的view默认是逻辑与关系,并非逻辑或)。
你想知道能不能在初始化视图时直接做更精确的筛选,比如类似下面的写法,避免后续遍历视图项:
auto card_lot = registry.view<const Card, const Owner == MAINPLAYER>();
直接给出结论:
- EnTT的
view模板参数只支持基于组件类型的筛选,不支持直接写组件值的条件判断,所以你想要的这种写法是无法实现的。
不过有两种实用的替代方案:
- 高频筛选场景:可以用
view结合filter方法,在初始化阶段就完成值筛选,写法如下:
这样得到的视图已经是过滤后的结果,无需后续手动遍历筛选。auto card_lot = registry.view<const Card, const Owner>().filter([](const Owner& owner) { return owner == MAINPLAYER; }); - 低频筛选场景:直接遍历视图的性能影响极小。EnTT的视图遍历做了高度优化,内存局部性极佳,遍历本身的开销几乎可以忽略,没必要特意纠结初始化时的筛选。
另外你查阅文档没找到相关函数是正常的——EnTT的核心设计是基于组件类型聚合实体,值筛选属于业务逻辑范畴,框架只提供基础工具让你高效实现这类需求。
内容的提问来源于stack exchange,提问作者sylargaf
相关产品推荐
相关产品推荐

