Skip to content

Implement lightweight syntax for component handling#591

Draft
ameligrana wants to merge 3 commits intomainfrom
handle
Draft

Implement lightweight syntax for component handling#591
ameligrana wants to merge 3 commits intomainfrom
handle

Conversation

@ameligrana
Copy link
Copy Markdown
Member

@ameligrana ameligrana commented Apr 1, 2026

Fixes #565

@ameligrana ameligrana added the API Changes related to the API that do not introduce new features label Apr 1, 2026
@codecov
Copy link
Copy Markdown

codecov bot commented Apr 1, 2026

Codecov Report

❌ Patch coverage is 91.35802% with 7 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/unchecked.jl 66.66% 7 Missing ⚠️

📢 Thoughts on this report? Let us know!

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 1, 2026

⚠️ 6 benchmark regressions detected!

Click to expand benchmark results

Time is per entity/N, allocations are totals. Allocations are only shown for current.

N       Time main             Time curr           Factor         Allocs         Bytes    
query_create
1000 5.92ns 5.89ns 1.00 0 0
query_create_filter
1000 5.85ns 5.93ns 1.01 0 0
query_posvel_1k_arch
100 7.25ns 6.91ns 0.95 0 0
1000 11.00ns 10.97ns 1.00 0 0
10000 2.66ns 2.77ns 1.05 0 0
100000 1.14ns 1.10ns 0.97 0 0
1000000 0.78ns 0.86ns ⚠️ 1.11 0 0
query_posvel_1k_arch_cached
100 8.10ns 7.89ns 0.97 0 0
1000 12.25ns 12.28ns 1.00 0 0
10000 2.72ns 2.84ns 1.04 0 0
100000 1.12ns 1.17ns 1.05 0 0
1000000 0.78ns 0.86ns 1.10 0 0
query_posvel_32_arch
100 2.15ns 2.15ns 1.00 0 0
1000 0.69ns 0.69ns 1.00 0 0
10000 0.45ns 0.44ns 0.98 0 0
100000 0.67ns 0.61ns 0.92 0 0
1000000 0.64ns 0.61ns 0.96 0 0
query_posvel_cold
100 0.71ns 0.93ns ⚠️ 1.32 0 0
1000 0.38ns 0.39ns 1.02 0 0
10000 0.39ns 0.37ns 0.95 0 0
100000 0.62ns 0.63ns 1.02 0 0
1000000 0.79ns 0.90ns ⚠️ 1.14 0 0
query_posvel_fields
100 0.38ns 0.40ns 1.05 0 0
1000 0.23ns 0.24ns 1.07 0 0
10000 0.32ns 0.32ns 1.00 0 0
100000 0.46ns 0.45ns 1.02 0 0
1000000 0.57ns 0.56ns 0.98 0 0
query_posvel_fields_broadcast
100 0.90ns 0.90ns 1.00 0 0
1000 0.71ns 0.71ns 1.00 0 0
10000 0.78ns 0.77ns 0.99 0 0
100000 0.91ns 0.99ns ⚠️ 1.10 0 0
1000000 1.34ns 1.35ns 1.01 0 0
query_posvel_hot
100 0.42ns 0.41ns 1.00 0 0
1000 0.24ns 0.24ns 1.00 0 0
10000 0.33ns 0.33ns 1.00 0 0
100000 0.46ns 0.45ns 1.02 0 0
1000000 0.61ns 0.59ns 0.97 0 0
query_posvel_soa
100 1.45ns 1.45ns 1.00 0 0
1000 1.31ns 1.32ns 1.01 0 0
10000 1.36ns 1.36ns 1.00 0 0
100000 1.38ns 1.38ns 1.00 0 0
1000000 1.39ns 1.39ns 1.00 0 0
query_posvel_soa_unpack
100 0.45ns 0.45ns 1.00 0 0
1000 0.24ns 0.24ns 1.00 0 0
10000 0.32ns 0.32ns 0.99 0 0
100000 0.45ns 0.49ns ⚠️ 1.11 0 0
1000000 0.58ns 0.59ns 1.01 0 0
world_add_remove_1
100 48.73ns 48.00ns 0.99 0 0
10000 49.52ns 48.84ns 0.99 0 0
world_add_remove_1_batch
100 3.99ns 4.07ns 1.02 0 0
10000 2.80ns 2.97ns 1.06 0 0
world_add_remove_1_large
100 54.84ns 54.10ns 0.99 0 0
10000 55.25ns 54.38ns 0.98 0 0
world_add_remove_1_soa
100 60.56ns 55.00ns 0.92 0 0
10000 61.42ns 55.95ns 0.92 0 0
world_add_remove_8
100 98.64ns 98.27ns 1.00 0 0
10000 100.17ns 99.87ns 1.00 0 0
world_add_remove_8_large
100 125.93ns 125.73ns 1.00 0 0
10000 128.86ns 127.16ns 0.99 0 0
world_add_remove_8_soa
100 137.07ns 137.46ns 1.00 0 0
10000 139.58ns 141.29ns 1.01 0 0
world_copy_entity_5
100 28.86ns 29.02ns 1.01 0 0
10000 28.54ns 28.78ns 1.01 0 0
world_get_1
100 1.05ns 1.06ns 1.01 0 0
10000 0.95ns 0.97ns 1.02 0 0
world_get_1_soa
100 1.62ns 1.62ns 1.00 0 0
10000 1.54ns 1.54ns 1.00 0 0
world_get_5
100 3.19ns 3.28ns 1.03 0 0
10000 3.12ns 3.20ns 1.02 0 0
world_get_5_unchecked
100 1.85ns 1.85ns 1.00 0 0
10000 1.83ns 1.83ns 1.00 0 0
world_get_rel
100 1.04ns 1.04ns 1.00 0 0
10000 0.94ns 0.94ns 1.00 0 0
world_has_1
100 1.05ns 1.04ns 0.99 0 0
10000 0.95ns 0.96ns 1.00 0 0
world_has_5
100 1.75ns 1.75ns 1.00 0 0
10000 1.68ns 1.68ns 1.00 0 0
world_new_entities_1
100 2.91ns 3.07ns 1.06 0 0
10000 2.24ns 2.29ns 1.02 0 0
world_new_entities_1_def
100 3.13ns 3.07ns 0.98 0 0
10000 2.43ns 2.43ns 1.00 0 0
world_new_entities_5
100 4.74ns 4.74ns 1.00 0 0
10000 3.84ns 3.87ns 1.01 0 0
world_new_entities_5_def
100 4.61ns 4.64ns 1.01 0 0
10000 3.64ns 4.01ns ⚠️ 1.10 0 0
world_new_entity_1
100 13.09ns 13.06ns 1.00 0 0
10000 12.91ns 12.96ns 1.00 0 0
world_new_entity_1_rel
100 36.10ns 36.13ns 1.00 0 0
10000 35.41ns 35.12ns 0.99 0 0
world_new_entity_1_soa
100 14.56ns 14.29ns 0.98 0 0
10000 14.35ns 14.10ns 0.98 0 0
world_new_entity_5
100 24.98ns 22.54ns 0.92 0 0
10000 25.41ns 22.91ns 0.92 0 0
world_new_entity_5_rel
100 55.07ns 53.47ns 0.97 0 0
10000 54.75ns 53.30ns 0.97 0 0
world_new_entity_5_soa
100 32.03ns 31.56ns 0.99 0 0
10000 32.79ns 31.97ns 0.98 0 0
world_posvel
100 2.84ns 2.84ns 1.00 0 0
10000 2.94ns 2.94ns 1.00 0 0
world_remove_entities_5
100 2.20ns 2.17ns 0.99 0 0
10000 0.97ns 0.98ns 1.01 0 0
world_remove_entity_5
100 22.64ns 22.74ns 1.00 0 0
10000 22.54ns 22.26ns 0.99 0 0
world_resource
1 7.94ns 7.84ns 0.99 0 0
world_set_1
100 2.84ns 2.81ns 0.99 0 0
10000 2.93ns 2.89ns 0.98 0 0
world_set_1_soa
100 2.66ns 2.74ns 1.03 0 0
10000 2.79ns 2.80ns 1.00 0 0
world_set_5
100 8.09ns 8.05ns 1.00 0 0
10000 8.82ns 8.81ns 1.00 0 0
world_set_rel
100 47.62ns 47.39ns 1.00 0 0
10000 43.10ns 43.61ns 1.01 0 0
world_set_rel_batch
100 2.31ns 2.44ns 1.06 0 0
10000 0.76ns 0.76ns 1.00 0 0
world_shuffle
100 9.60ns 9.59ns 1.00 0 0
10000 11.92ns 12.21ns 1.02 0 0
world_update_1
100 2.54ns 2.54ns 1.00 0 0
10000 2.61ns 2.62ns 1.00 0 0
world_update_5
100 9.70ns 9.78ns 1.01 0 0
10000 10.14ns 10.14ns 1.00 0 0

@mlange-42
Copy link
Copy Markdown
Member

@ameligrana Didn't you say:

I believe the current versions of the standard functions are okay as they are

😄

@ameligrana
Copy link
Copy Markdown
Member Author

yes, but with that I meant that I didn't want to reimplement also add_components!, remove_components!, etc... for this entity handle (though I actually did it for those two here since I think it is better to have those function working also on the handles)

In general I like this syntax, so I would like to introduce it. I'm also thinking that maybe shorten also our general syntax removing _components, I know we settled for verbosity sometime ago, but I'm thinking it is overly so at the moment, and it is already quite clear from the arguments what is happening.

@mlange-42
Copy link
Copy Markdown
Member

Basically, the only risk I see is that users may be tempted to store handles. Not sure how we can discourage that, except by the docs.

@ameligrana
Copy link
Copy Markdown
Member Author

I guess we can really break everything by defining something like

Base.length(::AbstractArray{EntityHandle}) = throw(error("EntityHandle must not be stored into an array"))
Base.getindex(::AbstractArray{EntityHandle}, inds...) = throw(error("EntityHandle must not be stored into an array"))
Base.setindex!(::AbstractArray{EntityHandle}, v, inds...) = throw(error("EntityHandle must not be stored into an array"))

@ameligrana
Copy link
Copy Markdown
Member Author

@ameligrana
Copy link
Copy Markdown
Member Author

I think just documenting that one should store entities directly is better in the end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

API Changes related to the API that do not introduce new features

Projects

None yet

Development

Successfully merging this pull request may close these issues.

A more intutive/less verbose syntax for components handling

2 participants