Skip to content

Commit 023e7ac

Browse files
committed
Save column indexing
1 parent d5baf52 commit 023e7ac

File tree

5 files changed

+155
-130
lines changed

5 files changed

+155
-130
lines changed

benches/visual/query.bench.luau

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,14 @@ return {
170170
end,
171171

172172
Functions = {
173-
Mirror = function()
174-
for entityId, firstComponent in mcs:query(E1, E2, E3, E4) do
173+
Matter = function()
174+
for entityId, firstComponent in newWorld:query(A1, A2, A3, A4) do
175175
end
176+
end,
176177

178+
ECR = function()
179+
for entityId, firstComponent in registry2:view(B1, B2, B3, B3) do
180+
end
177181
end,
178182

179183
Jecs = function()

image-3.png

3.93 KB
Loading

image.png

-187 KB
Binary file not shown.

src/init.luau

Lines changed: 137 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,15 @@ do
750750
local A, B, C, D, E, F, G, H
751751
local a, b, c, d, e, f, g, h
752752

753+
local init
754+
local drain
755+
753756
local function query_init(query)
757+
if init and drain then
758+
return
759+
end
760+
761+
init = true
754762
lastArchetype = 1
755763
archetype = compatible_archetypes[lastArchetype]
756764

@@ -767,157 +775,159 @@ do
767775

768776
local records = archetype.records
769777
if not B then
770-
a = records[A]
778+
a = columns[records[A]]
771779
elseif not C then
772-
a = records[A]
773-
b = records[B]
780+
a = columns[records[A]]
781+
b = columns[records[B]]
774782
elseif not D then
775-
a = records[A]
776-
b = records[B]
777-
c = records[C]
783+
a = columns[records[A]]
784+
b = columns[records[B]]
785+
c = columns[records[C]]
778786
elseif not E then
779-
a = records[A]
780-
b = records[B]
781-
c = records[C]
782-
d = records[D]
787+
a = columns[records[A]]
788+
b = columns[records[B]]
789+
c = columns[records[C]]
790+
d = columns[records[D]]
783791
elseif not F then
784-
a = records[A]
785-
b = records[B]
786-
c = records[C]
787-
d = records[D]
788-
e = records[E]
792+
a = columns[records[A]]
793+
b = columns[records[B]]
794+
c = columns[records[C]]
795+
d = columns[records[D]]
796+
e = columns[records[E]]
789797
elseif not G then
790-
a = records[A]
791-
b = records[B]
792-
c = records[C]
793-
d = records[D]
794-
e = records[E]
795-
f = records[F]
798+
a = columns[records[A]]
799+
b = columns[records[B]]
800+
c = columns[records[C]]
801+
d = columns[records[D]]
802+
e = columns[records[E]]
803+
f = columns[records[F]]
796804
elseif not H then
797-
a = records[A]
798-
b = records[B]
799-
c = records[C]
800-
d = records[D]
801-
e = records[E]
802-
f = records[F]
803-
g = records[G]
805+
a = columns[records[A]]
806+
b = columns[records[B]]
807+
c = columns[records[C]]
808+
d = columns[records[D]]
809+
e = columns[records[E]]
810+
f = columns[records[F]]
811+
g = columns[records[G]]
804812
elseif H then
805-
a = records[A]
806-
b = records[B]
807-
c = records[C]
808-
d = records[D]
809-
e = records[E]
810-
f = records[F]
811-
g = records[G]
812-
h = records[H]
813+
a = columns[records[A]]
814+
b = columns[records[B]]
815+
c = columns[records[D]]
816+
e = columns[records[E]]
817+
f = columns[records[F]]
818+
g = columns[records[G]]
819+
h = columns[records[H]]
813820
end
814821
end
815822

816-
local function world_query_next(): any
823+
local function world_query_iter_next(): any
817824
local entityId = entities[i]
818825
while entityId == nil do
819826
lastArchetype += 1
820827
archetype = compatible_archetypes[lastArchetype]
821828
if not archetype then
822829
return nil
823830
end
831+
832+
entities = archetype.entities
833+
i = #entities
834+
if i == 0 then
835+
continue
836+
end
837+
entityId = entities[i]
838+
columns = archetype.columns
824839
local records = archetype.records
825840
if not B then
826-
a = records[A]
841+
a = columns[records[A]]
827842
elseif not C then
828-
a = records[A]
829-
b = records[B]
843+
a = columns[records[A]]
844+
b = columns[records[B]]
830845
elseif not D then
831-
a = records[A]
832-
b = records[B]
833-
c = records[C]
846+
a = columns[records[A]]
847+
b = columns[records[B]]
848+
c = columns[records[C]]
834849
elseif not E then
835-
a = records[A]
836-
b = records[B]
837-
c = records[C]
838-
d = records[D]
850+
a = columns[records[A]]
851+
b = columns[records[B]]
852+
c = columns[records[C]]
853+
d = columns[records[D]]
839854
elseif not F then
840-
a = records[A]
841-
b = records[B]
842-
c = records[C]
843-
d = records[D]
844-
e = records[E]
855+
a = columns[records[A]]
856+
b = columns[records[B]]
857+
c = columns[records[C]]
858+
d = columns[records[D]]
859+
e = columns[records[E]]
845860
elseif not G then
846-
a = records[A]
847-
b = records[B]
848-
c = records[C]
849-
d = records[D]
850-
e = records[E]
851-
f = records[F]
861+
a = columns[records[A]]
862+
b = columns[records[B]]
863+
c = columns[records[C]]
864+
d = columns[records[D]]
865+
e = columns[records[E]]
866+
f = columns[records[F]]
852867
elseif not H then
853-
a = records[A]
854-
b = records[B]
855-
c = records[C]
856-
d = records[D]
857-
e = records[E]
858-
f = records[F]
859-
g = records[G]
868+
a = columns[records[A]]
869+
b = columns[records[B]]
870+
c = columns[records[C]]
871+
d = columns[records[D]]
872+
e = columns[records[E]]
873+
f = columns[records[F]]
874+
g = columns[records[G]]
860875
elseif H then
861-
a = records[A]
862-
b = records[B]
863-
c = records[C]
864-
d = records[D]
865-
e = records[E]
866-
f = records[F]
867-
g = records[G]
868-
h = records[H]
876+
a = columns[records[A]]
877+
b = columns[records[B]]
878+
c = columns[records[D]]
879+
e = columns[records[E]]
880+
f = columns[records[F]]
881+
g = columns[records[G]]
882+
h = columns[records[H]]
869883
end
870-
columns = archetype.columns
871-
entities = archetype.entities
872-
i = #entities
873-
entityId = entities[i]
874884
end
875885

876886
local row = i
877887
i-=1
878888

879889
if queryLength == 1 then
880-
return entityId, columns[a][row]
890+
return entityId, a[row]
881891
elseif queryLength == 2 then
882-
return entityId, columns[a][row], columns[b][row]
892+
return entityId, a[row], b[row]
883893
elseif queryLength == 3 then
884-
return entityId, columns[a][row], columns[b][row], columns[c][row]
894+
return entityId, a[row], b[row], c[row]
885895
elseif queryLength == 4 then
886-
return entityId, columns[a][row], columns[b][row], columns[c][row], columns[d][row]
896+
return entityId, a[row], b[row], c[row], d[row]
887897
elseif queryLength == 5 then
888898
return entityId,
889-
columns[a][row],
890-
columns[b][row],
891-
columns[c][row],
892-
columns[d][row],
893-
columns[e][row]
899+
a[row],
900+
b[row],
901+
c[row],
902+
d[row],
903+
e[row]
894904
elseif queryLength == 6 then
895905
return entityId,
896-
columns[a][row],
897-
columns[b][row],
898-
columns[c][row],
899-
columns[d][row],
900-
columns[e][row],
901-
columns[f][row]
906+
a[row],
907+
b[row],
908+
c[row],
909+
d[row],
910+
e[row],
911+
f[row]
902912
elseif queryLength == 7 then
903913
return entityId,
904-
columns[a][row],
905-
columns[b][row],
906-
columns[c][row],
907-
columns[d][row],
908-
columns[e][row],
909-
columns[f][row],
910-
columns[g][row]
914+
a[row],
915+
b[row],
916+
c[row],
917+
d[row],
918+
e[row],
919+
f[row],
920+
g[row]
911921
elseif queryLength == 8 then
912922
return entityId,
913-
columns[a][row],
914-
columns[b][row],
915-
columns[c][row],
916-
columns[d][row],
917-
columns[e][row],
918-
columns[f][row],
919-
columns[g][row],
920-
columns[h][row]
923+
a[row],
924+
b[row],
925+
c[row],
926+
d[row],
927+
e[row],
928+
f[row],
929+
g[row],
930+
h[row]
921931
end
922932

923933
local field = archetype.records
@@ -968,26 +978,26 @@ do
968978
local tr = archetype.records
969979
for row in archetype.entities do
970980
if queryLength == 1 then
971-
local va = columns[tr[a]]
981+
local va = columns[tr[A]]
972982
local pa = fn(va[row])
973983

974984
va[row] = pa
975985
elseif queryLength == 2 then
976-
local va = columns[tr[a]]
977-
local vb = columns[tr[b]]
986+
local va = columns[tr[A]]
987+
local vb = columns[tr[B]]
978988

979989
va[row], vb[row] = fn(va[row], vb[row])
980990
elseif queryLength == 3 then
981-
local va = columns[tr[a]]
982-
local vb = columns[tr[b]]
983-
local vc = columns[tr[c]]
991+
local va = columns[tr[A]]
992+
local vb = columns[tr[B]]
993+
local vc = columns[tr[C]]
984994

985995
va[row], vb[row], vc[row] = fn(va[row], vb[row], vc[row])
986996
elseif queryLength == 4 then
987-
local va = columns[tr[a]]
988-
local vb = columns[tr[b]]
989-
local vc = columns[tr[c]]
990-
local vd = columns[tr[d]]
997+
local va = columns[tr[A]]
998+
local vb = columns[tr[B]]
999+
local vc = columns[tr[C]]
1000+
local vd = columns[tr[D]]
9911001

9921002
va[row], vb[row], vc[row], vd[row] = fn(
9931003
va[row], vb[row], vc[row], vd[row])
@@ -1026,6 +1036,8 @@ do
10261036
end
10271037
end
10281038

1039+
query_init(query)
1040+
10291041
return query
10301042
end
10311043

@@ -1036,19 +1048,22 @@ do
10361048
return compatible_archetypes
10371049
end
10381050

1039-
local drain
1040-
10411051
local function world_query_drain(query)
10421052
drain = true
10431053
query_init(query)
10441054
return query
10451055
end
10461056

10471057
local function world_query_iter(query)
1058+
query_init(query)
1059+
return world_query_iter_next
1060+
end
1061+
1062+
local function world_query_next()
10481063
if not drain then
1049-
query_init(query)
1064+
error("Did you forget to call query:drain()?")
10501065
end
1051-
return world_query_next
1066+
return world_query_iter_next()
10521067
end
10531068

10541069
local it = {
@@ -1113,6 +1128,7 @@ do
11131128
end
11141129

11151130
drain = false
1131+
init = false
11161132
ids = components
11171133

11181134
return it

0 commit comments

Comments
 (0)