기본적인 흐름은 이해했는데
아직 제대로 배운지 1주도 안됐고 독학이긴 하지만
이건 진짜 ㅈ같다는 소리가 절로나오네.
지금 문제는 엔티티를 서브씬에 있는 프리팹을
SystemAPI.QueryBuilder()
.WithAll<UnitTag, Prefab>()
.Build()
.GetSingletonEntity();
이런식으로 가져오고
public partial struct SpawnUnitJob : IJobEntity
{
public EntityCommandBuffer.ParallelWriter ecb;
public Entity prefab;
public void Execute(RefRO<UnitSpawnRequest> spawnRequest, Entity requestEntity, [ChunkIndexInQuery] int sortKey)
{
Entity newEntity = ecb.Ins1tantiate(sortKey, prefab);
ecb.SetComponent(sortKey, newEntity, spawnRequest.ValueRO.LocalTransform);
ecb.SetComponent(sortKey, newEntity, spawnRequest.ValueRO.MoveComponent);
ecb.DestroyEntity(sortKey, requestEntity);
}
}
대충 이런식으로 SpawnRequest라는 엔티티가 동적으로 생성되면 시스템에서는 그 엔티티를 가져와
프리팹을 동적생성시키고 생성요청 엔티티는 삭제
이런식으로 생성하는 코드를 만들긴 했음,
근데 이렇게 해야하는게 맞는건가? 잘 모르겠다는 생각이 드는 것 자체가 첫번째 문제고
프리팹 엔티티를 Ins1tantiate하면 삭제시킬땐 어떻게해야하나 물어보니 DestroyEntity를 해도 되긴 하나
풀링을 권장하더라?
그래서 지피티랑 제미나이에 물어보면
1. 쿼리를 캐싱하고 NativeA1rray를 가져와 써야한다
2. 막상 돌려보니 .ToEntityA1rray(Allocator.TempJob)<-이게 메모리 누수 발생시킴.
3. 정작 A1rray를 가져와도 병렬처리면 동시성 접근문제가 있어 어느 인덱스에 있는걸 가져와 써야하는지 모름
4. NativeQueue로 해야한다 -> 병렬처리에 못씀
지금은 또 Disabled 컴포넌트와, IEnableableComponent라는게 있다는걸 알긴 했는데
이걸로 뭘 어떻게 해야하는지도 모르겠고
인공지능한테 물어봐도 지들도 헷갈려서 헛소리 하는데 (특히 최신버전 문서 기준으로 얘기하라고 해도 자꾸 구버전 기준으로 코드를 쳐 내놓음)
뭔가 많이 만들어져는 있지만 이걸 사람들이 쓰도록 할 생각이 있긴 한건가? 싶다.
쓰는법이 너무 좆같아서 한 10년차 개발자가 와도 쉽지않을듯
'동시성' ㄷㄷ
난 개인적으로 풀링을 권장하지 않음. 다만 destroy보다는 비활성화를 하고, 일정 간격으로 한꺼번에 destroy하고 있음. 생성 같은 경우 구현하는 방법이 많으니까 이걸 탐구하는 것도 코딩의 재미일듯. 나는 보통 2가지 방법 중에서 골라 씀
일정 간격이라는게 0.1초 간격 이런 식인건가? 비활성화해서 안보이게 하고 IEnableableComponent를 false로 만든다음 일정시간 간격으로 지우는게 프레임마다 지우는거보다 훨씬 이득?
병렬처리 하려면 nativeparallel 달린 거 써야함 IenableableComponent는 ecs의 꽃임. 익숙해지면 굉장한 걸 할 수 있음.
NativeList.ParallelWriter이랑 NativeQueue.ParallelWriter 이거 말하는거 맞죠? 큐는 보니까 Enqueue만 가능하고 Dequeue밖에 안되고 알고있던거랑 다른게 많은듯
Enqueue만 가능하고 Dequeue는 못하는데 이럴거면 Queue가 뭐하러 있나하는생각,
사실 풀링도 게임오브젝트의 Ins1tantiate랑 Destroy 성능이 확 튀어서 썼던건데 ecs에서까지 굳이 풀링을 써야하나 싶긴하네요. 님이 말씀해주신대로 IEnableableComponent도 제대로 살펴보고 비활성화된거 일정주기로 Destroy시키는식으로 하는게 좋겠네요 ㄳㄳ
@ㅇㅇ(121.140) Dequeue는 아마 다른 멀티쓰레딩에서도 안될듯? 그런 상황은 피하셈. ECS에서 병렬로 빼기가 필요할 때는 EntityCommandBuffer에 필요한 액션을 기록해 둔 다음에 끝에 한꺼번에 진행함.
1주일도 안됐으면 아직 유니티 공식 예제 보고 있어야할 때인데, 이론 학습을 먼저 해두는 걸 추천함
DOTS는 AI들이 잘 못하더라. 질문 내용을 보아하니 메뉴얼과 공식 샘플 아직 안 뜯어본듯?
ㄴㄴ 지금 1.4가 최신이라 메뉴얼 사이트 알려주고 이것만 보라고하면 되긴 하는데 지금 풀려있는 자료중에 구버전 자료가 너무 많아서 자꾸 구버전 자료랑 혼합해서 알려줌
OOP는 전체 데이터를 통해 알려주는데 DOTS는 최신 메뉴얼만 보니 당연히 잘 못하는게 맞지.