#ecs #world #pi

nightly pi_world

ecs world

22 个版本

0.1.22 2024 年 8 月 19 日
0.1.21 2024 年 6 月 12 日
0.1.20 2024 年 4 月 26 日
0.1.10 2024 年 3 月 15 日

106内存管理

Download history 2/week @ 2024-05-03 3/week @ 2024-05-17 2/week @ 2024-05-24 152/week @ 2024-06-07 22/week @ 2024-06-14 3/week @ 2024-06-21 88/week @ 2024-07-05 7/week @ 2024-07-12 143/week @ 2024-08-16

每月 143 次下载

MIT/Apache

510KB
10K SLoC

已知问题

ecs 的性能测试不太满意,

schedule 多线程运行时会卡住

ExecGraph 的多线程 测试用例的覆盖率差

Query 的异步迭代,Insert 异步并行插入,提供一个异步的劈分方法?为世界矩阵的层脏做个异步多线程的测试用例

测试用例的覆盖率差

文档差

代码注释差

需要构建一个 Component 的静态依赖图-转成位图集, 如果两个 system 检查在该图上可以并行,则同一个原型下的两个 system 也是可以并行的。构建 2 个图,一个普通的完全图,动态修改时加锁,里面的节点包括:System 运行集 原型-组件 单例资源 多例资源。在该图上分析依赖,如果两个 system 被明确指定了依赖,则在读写分析时发现循环时,遵循指定的依赖。还有一个 System 的依赖表(小的 ComponentIndex 加大的 ComponentIndex 为键,值为强制读写或弱读写),也是加锁操作。还有 1 个仅 system 的执行图,这个需要线程安全的添加边。

需要把执行图的图部分拆成单独的 crate,这样静态依赖图和渲染图都可以重用这个图,同时也好检查是否循环引用。

优化原型名字的表达,类似 use 模块。

可查看出整个 world 的原型内存状态。

测试 get 性能 去掉 Queryer 和 Alteror Inserter, 去掉 SafeVec, 提出pi_listener(将settle trait 放入 pi_append_vec)

ecs world 上提供 mem_size

检查 world settle ,否则没法解释为啥 get 和 iter 慢, 也有可能是 Mut 慢?

单例和多例需要提供 mem_size?

v0.1.11

已经支持异步 system

新实现 Local 的 SystemParm

v0.2

增加 World 的 tick

单例上加 tick

多例上加 tick

支持了 Insert 空原型,及 alter 从空原型变为有组件原型

增加 Ticker, 支持查询组件 is_changed

合并 Added 和 Changed,常用的单组件改变查询的情况下,性能有提升

如果一个原型的 Component 被 Ticker 查询或有 Changed 过滤,则会在 Column 上增加 Tick 记录,

增加 Destroyed 的 entity,保留其 Component,直到所以监听 Destroyed 的 system 都执行完毕再删除 Entity

增加 Removed<组件>, 原型上加 remove_columns 的监听

增加了 ArchetypeInfo 的查询对象,显示实体所在的原型及行

优化了 Query.iter, 根据是否有脏监听过滤器分为三种情况迭代,iter_normal, iter_dirty, iter_dirtys,多个脏监听内部使用bitset去重

v0.3

ArcheypeWorldIndex ComponentIndex ColumnIndex Row 改成类型

将原型图节点拆成了原型组件节点

优化 Query 的 CacheMapping,及 alter 的 Mapping

优化 SingleRes 的 init_state, 抽成多个函数,这样相同的 T 可以共用函数

v0.4

有 Changed 或 Removed 的组件,全部原型上对应组件的 Column 和 RemovedColumn 都增加 Tick 记录,这样全局跟踪 Tick,并根据该 Tick 来剔除已经读取过的变化,同时确保系统读取时不会丢失变化。同时,也会根据最旧的 System 的 last_run,来尽量减少脏列表中 Row 的长度。

根据 ComponentInfo 及其 world_index,优化了 alter 时计算相应原型的过程。

v0.5

调整了 alter 的代码,将泛型部分分离

将 alter 改为立即执行,这样可以更好的复用,并且在一个 system 内可连续修改(要求修改后的原型也要被 Query 捕获)

v0.6

alter 还是改为延迟,EntityEditor 的 alter 为立即执行

ComponentRemoved 是一个 SystemParam,可迭代出上次运行到这次的运行期间被删除的组件的实体

v0.7

调整了 Archetype 和 Column 的关系, Column 包含多个 Archetype 的 Blob

优化了 Query 的 get 方法的性能

v0.8

SetDefault 改为 SetFromWorld

单例多例都提前 downcast

meta 将单例多例资源记录关系,事件支持安全的读写,所以不记录关系

增加 ComponentAdded 和 Changed

增加 OrDefaultRef

依赖

~13–41MB
~640K SLoC