Skip to content

Commit 2c25a47

Browse files
committed
fix bugs
1 parent cf31e78 commit 2c25a47

File tree

8 files changed

+40
-20
lines changed

8 files changed

+40
-20
lines changed

include/UECS/AccessTypeID.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ namespace Ubpa::UECS {
2929
static constexpr AccessTypeID AccessTypeID_of = { TypeID_of<RemoveTag_t<Cmpt>>, AccessMode_of<Cmpt> };
3030

3131
using AccessTypeIDSet = small_flat_set<AccessTypeID, 16, std::less<>>;
32+
33+
template<std::size_t N>
34+
class TempAccessTypeIDs : public TempArray<AccessTypeID, N> {
35+
using TempArray<AccessTypeID, N>::TempArray;
36+
};
37+
template<typename... Ts> TempAccessTypeIDs(Ts...)->TempAccessTypeIDs<sizeof...(Ts)>;
38+
template<typename... Ts>
39+
constexpr auto AccessTypeIDs_of = TempAccessTypeIDs{ AccessTypeID_of<Ts>... };
3240
}
3341

3442
template<>

include/UECS/CmptPtr.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ namespace Ubpa::UECS {
99
class CmptPtr {
1010
public:
1111
constexpr CmptPtr(TypeID type, void* p) noexcept : type{ type }, p{ p } {}
12-
template<typename Cmpt>
13-
constexpr CmptPtr(Cmpt* p) noexcept : type{ TypeID_of<Cmpt> }, p{ p } {}
12+
template<typename Cmpt> requires std::negation_v<std::is_void<std::decay_t<Cmpt>>>
13+
constexpr explicit CmptPtr(Cmpt* p) noexcept : type{ TypeID_of<Cmpt> }, p{ p } {}
1414
constexpr CmptPtr() noexcept : CmptPtr{ Invalid() } {}
1515

1616
constexpr void* Ptr() const noexcept { return p; }

include/UECS/details/Schedule.inl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ namespace Ubpa::UECS {
9494
return RegisterChunkJob(
9595
std::forward<Func>(func),
9696
RegisterFrameString(name),
97-
config.isParallel,
9897
std::move(config.archetypeFilter),
98+
config.isParallel,
9999
std::move(config.singletonLocator),
100100
std::move(config.randomAccessor),
101101
std::move(config.changeFilter),

src/core/Archetype.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -154,19 +154,14 @@ Archetype::EntityAddress Archetype::Create(Entity e) {
154154
const auto& trait = cmptTraits.GetTraits()[i];
155155
const std::size_t offset = offsets[i];
156156
const auto& type = *(cmptTraits.GetTypes().begin() + i);
157-
if (type.Is<Entity>()) {
158-
constexpr std::size_t size = sizeof(Entity);
159-
memcpy(buffer + offset + idxInChunk * size, &e, size);
160-
}
161-
else {
162-
std::uint8_t* dst = buffer + offset + idxInChunk * trait.size;
157+
std::uint8_t* dst = buffer + offset + idxInChunk * trait.size;
158+
if (type == TypeID_of<Entity>)
159+
new(dst)Entity(e);
160+
else
163161
trait.DefaultConstruct(dst, chunk->GetChunkUnsyncResource());
164-
}
165162
}
166163
chunk->GetHead()->ForceUpdateVersion(world->Version());
167164

168-
entityNum++;
169-
170165
return addr;
171166
}
172167

@@ -200,13 +195,16 @@ Archetype::EntityAddress Archetype::RequestBuffer() {
200195
if (chunkhead->num_entity == chunkhead->capacity)
201196
nonFullChunks.erase(chunkIdx);
202197

198+
entityNum++;
199+
203200
return EntityAddress{ .chunkIdx = chunkIdx, .idxInChunk = idxInChunk };
204201
}
205202

206203
CmptAccessPtr Archetype::At(AccessTypeID type, EntityAddress addr) const {
207204
auto target = cmptTraits.GetTypes().find(type);
208205
if (target == cmptTraits.GetTypes().end())
209-
return nullptr;
206+
return { type, nullptr };
207+
210208
auto typeIdx = static_cast<std::size_t>(std::distance(cmptTraits.GetTypes().begin(), target));
211209

212210
const auto& trait = cmptTraits.GetTraits()[typeIdx];
@@ -300,14 +298,15 @@ std::size_t Archetype::Erase(EntityAddress addr) {
300298

301299
std::size_t movedEntityIdx = chunk->Erase(addr.idxInChunk);
302300

301+
entityNum--;
302+
303303
if (chunk->Empty()) {
304304
nonFullChunks.erase(addr.chunkIdx);
305305
chunk->~Chunk();
306306
world->GetUnsyncResource()->deallocate(chunk, sizeof(Chunk), alignof(Chunk));
307+
chunks.erase(std::find(chunks.begin(), chunks.end(), chunk));
307308
}
308309

309-
entityNum--;
310-
311310
return movedEntityIdx;
312311
}
313312

src/core/ArchetypeCmptTraits.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ void ArchetypeCmptTraits::Deregister(TypeID type) noexcept {
9393
return;
9494

9595
std::size_t idx = static_cast<std::size_t>(std::distance(types.begin(), ttarget));
96+
types.erase(ttarget);
9697
auto target = cmpt_traits.begin() + idx;
9798
if (!target->trivial) {
9899
cmpt_traits.erase(target);

src/core/EntityMngr.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,11 @@ bool EntityMngr::GenEntityJob(World* w, Job* job, SystemFunc* sys, int layer) co
363363
auto chunks = archetype->GetChunks();
364364
for (std::size_t i = 0; i < chunks.size(); i++) {
365365
chunks[i]->ApplyChanges({ sys->entityQuery.locator.AccessTypeIDs().data(), sys->entityQuery.locator.AccessTypeIDs().size() });
366+
chunks[i]->ApplyChanges({ sys->randomAccessor.types.data(), sys->randomAccessor.types.size() });
366367
if (!sys->changeFilter.types.empty() && !chunks[i]->HasAnyChange(sys->changeFilter.types, world->Version()))
367368
continue;
369+
if (chunks[i]->EntityNum() == 0)
370+
continue;
368371
job->emplace([=, chunk = chunks[i], singletons = singletons]() {
369372
auto [entities, cmpts, sizes] = chunk->Locate({ sys->entityQuery.locator.AccessTypeIDs().data(), sys->entityQuery.locator.AccessTypeIDs().size() });
370373
std::size_t indexOffsetInChunk = indexOffsetInQuery + indexOffsetInArchetype;
@@ -400,8 +403,11 @@ bool EntityMngr::GenEntityJob(World* w, Job* job, SystemFunc* sys, int layer) co
400403

401404
for (std::size_t i = 0; i < chunks.size(); i++) {
402405
chunks[i]->ApplyChanges({ sys->entityQuery.locator.AccessTypeIDs().data(), sys->entityQuery.locator.AccessTypeIDs().size() });
406+
chunks[i]->ApplyChanges({ sys->randomAccessor.types.data(), sys->randomAccessor.types.size() });
403407
if (!sys->changeFilter.types.empty() && !archetype->chunks[i]->HasAnyChange(sys->changeFilter.types, world->Version()))
404408
continue;
409+
if (chunks[i]->EntityNum() == 0)
410+
continue;
405411

406412
auto [entities, cmpts, sizes] = chunks[i]->Locate({ sys->entityQuery.locator.AccessTypeIDs().data(), sys->entityQuery.locator.AccessTypeIDs().size() });
407413
std::size_t indexOffsetInChunk = indexOffsetInQuery + indexOffsetInArchetype;
@@ -456,9 +462,12 @@ bool EntityMngr::GenChunkJob(World* w, Job* job, SystemFunc* sys, int layer) con
456462
for (std::size_t i = 0; i < chunks.size(); i++) {
457463
chunks[i]->ApplyChanges({ sys->entityQuery.filter.all.data(), sys->entityQuery.filter.all.size() });
458464
chunks[i]->ApplyChanges({ sys->entityQuery.filter.any.data(), sys->entityQuery.filter.any.size() });
465+
chunks[i]->ApplyChanges({ sys->randomAccessor.types.data(), sys->randomAccessor.types.size() });
459466
assert(sys->entityQuery.locator.AccessTypeIDs().empty());
460467
if (!sys->changeFilter.types.empty() && !chunks[i]->HasAnyChange(sys->changeFilter.types, world->Version()))
461468
continue;
469+
if (chunks[i]->EntityNum() == 0)
470+
continue;
462471

463472
std::size_t indexOffsetInChunk = indexOffsetInQuery + indexOffsetInArchetype;
464473

@@ -495,6 +504,8 @@ bool EntityMngr::GenChunkJob(World* w, Job* job, SystemFunc* sys, int layer) con
495504
assert(sys->entityQuery.locator.AccessTypeIDs().empty());
496505
if (!sys->changeFilter.types.empty() && !archetype->chunks[i]->HasAnyChange(sys->changeFilter.types, world->Version()))
497506
continue;
507+
if (chunks[i]->EntityNum() == 0)
508+
continue;
498509

499510
std::size_t indexOffsetInChunk = indexOffsetInQuery + indexOffsetInArchetype;
500511
(*sys)(
@@ -608,14 +619,14 @@ CmptAccessPtr EntityMngr::GetSingleton(AccessTypeID access_type) const {
608619
num += archetype->EntityNum();
609620

610621
if (num != 1)
611-
return { TypeID{}, nullptr, AccessMode::WRITE };
622+
return { access_type, nullptr };
612623

613624
for (auto* archetype : archetypes) {
614625
if (archetype->EntityNum() != 0)
615626
return archetype->At(access_type, { 0,0 });
616627
}
617628

618-
return { TypeID{}, nullptr, AccessMode::WRITE };
629+
return { access_type, nullptr };
619630
}
620631

621632
void EntityMngr::NewFrame() noexcept {

src/test/05_alignment/main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ struct alignas(256) G {
3737
int main() {
3838
World w;
3939
w.entityMngr.cmptTraits.Register<A, B, C, D, E, F, G>();
40-
w.entityMngr.Create(Ubpa::TypeIDs_of<A, B, C, D, E, F, G>);
40+
auto e = w.entityMngr.Create(Ubpa::TypeIDs_of<A, B, C, D, E, F, G>);
41+
w.entityMngr.Destroy(e);
4142
return 0;
4243
}

src/test/24_rsrc/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ struct FillSystem {
3636
static void OnUpdate(Schedule& schedule) {
3737
schedule.RegisterEntityJob(
3838
[](Buffer* buffer) {
39-
for (std::size_t j = 0; j < 100; j++)
39+
for (std::size_t j = 0; j < 50; j++)
4040
buffer->value.push_back(j);
4141
},
4242
"Fill"
@@ -83,7 +83,7 @@ int main() {
8383
w.systemMngr.RegisterAndCreate<FillSystem>();
8484
w.systemMngr.Activate<FillSystem>();
8585

86-
for (std::size_t i = 0; i < 10000; i++)
86+
for (std::size_t i = 0; i < 100000; i++)
8787
w.entityMngr.Create(TypeIDs_of<Buffer>);
8888

8989
w.Update();

0 commit comments

Comments
 (0)