Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. Dismiss Notice

New enabled/disabled state filtering

Discussion in 'Entity Component System' started by JooleanLogic, May 31, 2020.

  1. JooleanLogic

    JooleanLogic

    Joined:
    Mar 1, 2018
    Posts:
    447
    This relates to the post from Joachim here on new feature coming but I thought it better to start a new thread on it than pollute that one.
    Also I realise I'm getting ahead of myself as the functionality isn't out yet but the choice of filtering vs tagging is an area I struggle with so just want to throw out some queries on this new mechanism.

    Is this just going to use the existing archetype/chunk architecture with an added bitstream per component or is it going to be achieved through some new architectural mechanism? I.e. the more components added whether disabled or not is still going to widen the archetype and reduce the entity count per chunk?
    Will bitstream be stored in chunk also?
    Although I'm sure it's negligible, I presume all structural changes will now require copying enabled status as well?

    I've used such filter technique myself where the filter is a seperate stream from its component, but it made me wonder whether only touching every nth enabled component in a stream could have a negative effect on sequential cache prefetching?

    At the moment, such filtering approach means running all relevant systems even if no component in query is enabled.
    Is there going to be any kind of mechanism at the chunk/archetype level maybe to determine if some/none of a component type is enabled so we can filter out entire chunks/systems?
    Will we have ability to specify that we're not using enabled/disabled so we can remove any behind the scenes filtering checks?

    Will we get flexible options for filtering on these as opposed to treating disabled components as non existant?
    E.g. you might want to enable CompB based on timer value in CompA and then set some properties of CompB at same time.
    I guess this is the same as just being able to disable builtin filtering and access components regardless of enabled state.

    This is my biggest difficulty with tagging vs filtering. It's really an optimisation choice, yet it's very hard to determine ahead of time which of these options is going to be more performant. Except in the simple case, entities contain many components so optimising for one scenario can be detrimental to others.
    Problem is it's not easy to refactor between these two choices. Tagging has far reaching consequences like ecbs and synch points and filtering requires conditionals all over the place with excess Systems running and increased mem and fragmentation. Perhaps refactoring will be a bit easier with built in enabled state though.

    Looking ahead, I wonder that this new filtering approach won't eventually become the defacto standard instead of add/remove (tagging) components as
    1. it's going to be built in to every component anyway
    2. it's way easier than having to deal with ecbs and structural changes especially as it's hidden
    3. you perhaps won't want to mix the two techniques as tagging components of a wider archetype is going to be even more costly. I personally found mixing both techniques a bit messy/complicated as well.
    4. the tagging/filtering choice is going to be confusing to newcomers (I include myself) as they achieve the same goal, so I imagine most will start with filtering as it's easier.
    5. there's many benefits to a built in filtering approach from an ease-of-use perspective with the only downside being unknowable (ahead of time) performance issues.
    I'm not advocating for one or the other as they're both going to exist anyway and experienced devs will choose the right tool. I'm just curious what the future ecs recommendations are going to be given Joachim's comments about their game code teams preference for filtering.
    Alas for me, indecisiveness is an illness. Next topic, entities vs buffers. :)
     
  2. JesOb

    JesOb

    Joined:
    Sep 3, 2012
    Posts:
    1,081
    Join to all these questions and want to ask additionaly: is it actually will be built in to EVERY component or it is will be choose of component's author?
     
    Orimay likes this.
  3. JooleanLogic

    JooleanLogic

    Joined:
    Mar 1, 2018
    Posts:
    447
    I'm just going off what Joachim said but as it's a new feature and not released yet, I'm sure it's open to changing as they see best.
     
  4. PublicEnumE

    PublicEnumE

    Joined:
    Feb 3, 2019
    Posts:
    729
    Additional Question:

    1. Will DynamicBuffers be included?

    And a comment: The only obvious downside I see is that disabled component data would still exist in the entity’s chunk, reducing its chunk utilization.

    When I first approached ECS, I thought archetype changes should be avoided at all costs. So I took a similar approach to this (disable/enable). My entities started with every component they could ever need, disabled. As a result, my archetypes never changed, but my chunk utilization was very low: 8 for most of my entities.

    Later, I switched to an archetype switching approach, and that chunk utilization jumped to 23.
     
    Discipol likes this.
  5. Joachim_Ante

    Joachim_Ante

    Unity Technologies

    Joined:
    Mar 16, 2005
    Posts:
    5,203
    What we are currently working towards is:

    1. Every component type including dynamic buffer is Enable / Disable'able.
    2. Filtering by Enable / Disable is the default for EntityQuery / IJobChunk / Entities.ForEach etc A disabled component by default in terms of filtering acts 100% the same as if the component doesn't exist at all. EntityQueryDesc has an option to turn off filtering based on Enable flag. (Essentially completely ignoring the enable flag and giving the same behaviour as we have today)
    3. The bit flags are stored packed so we can do it efficiently for large batches of entities with SIMD code at once.


    There are two approaches here.
    1. We can increase the size of chunks. We internally discussed Introducing mega-chunks & tiny chunks. It would happen automatically. Eg. singletons would end up in a tiny chunk, using only 512 bytes of memory. But we can also introduce mega-chunks of 256kb of memory for each chunk for example instead of the default of 16kb. In practice i don't think the total memory consumption is a real world constraint for most game code entities. It's usually the memory access patterns instead that is actually problematic. So i think that should work quite well.


    2. It gives you the option to mix and match. From a game code writing perspective Enable flags don't change your code. It all happens for you automatically. But you can for example decide to immediately disable a component in a parallel for job, without causing a structural change. And then at the beginning of next frame when there is a sync point anyway, move entities with similar disabled / enabled components to be clustered in the same chunks. Obviously there is also nothing that prevents you from continuing to add / remove components. If that is done at very low frequency but the processing of those entities is done at very high frequency then obviously having everything in chunks with no disabled components will be more efficient.

    The point is it gives new optimisation options you can take advantage without changing your game code.
     
    Last edited: Jun 2, 2020
  6. temps12

    temps12

    Joined:
    Nov 28, 2014
    Posts:
    41
    Sounds like a great addition. Do you have any plans for being able to react to enable/disable? Not instantaneous ofc.
    Do we perhaps have to track the old status ourselves and then check every frame with versioning filter?
     
  7. Joachim_Ante

    Joachim_Ante

    Unity Technologies

    Joined:
    Mar 16, 2005
    Posts:
    5,203
    We are working on a design for making reactive onadd / onchange / onremove as easy as Entities.ForEach.

    Internally this builds on top of system state components. Naturally those can also be enabled / disabled with the work we are doing there. Until then doing that manually is the correct approach.
     
  8. PublicEnumE

    PublicEnumE

    Joined:
    Feb 3, 2019
    Posts:
    729
    Thank you. The more I think about this, the more I'm excited for the potential. There's a chance this could eliminate all but one of our custom sync points (the remaining one is only occasionally used for spawning).

    A few questions:

    1. Regarding mega and tiny chunks: Is it right to assume this feature is only in consideration right now, and shouldn't be expected to drop at the same time as enable/disable states?

    2. Please help me understand the benefit of mega-chunks: I thought the 16kb limit for chunk size was based on the L1 cache length of most CPUs. By using a mega-chunk, would we be making a concession that most of its data would live on the L2 cache, but with the argument that that's still really dang fast, and not a real-world bottleneck for most projects (like you mentioned above)?

    3. ...I'm still nervous about chunk utilization - specifically, the need to load an entity up with a lot of components, up front. In our project, we use Components and DynamicBuffers to represent ai behaviors. Some behaviors use DBs, because agents can be performing multiple instances of them at once (for example, counting down multiple, different timers). This approach has worked very well - it's both super performant, and intuitive for our designers to understand. I've been blown away by how fast dots makes this pattern run.

    However, for a single agent, the possibility space of all the behaviors they might perform could be vast. Having all of these behavior components on an agent from the start might be infeasible - I could imagine a single agent not even being able to fit inside of a chunk.

    We always try to bound the number of behaviors an NPC can perform, in our ai design. But if every new behavior type means a possible perf hit, that is...an uncomfortable design constraint to have. It would mean the engineering and game design are in conflict, working against each other.

    For these reasons, a while back we switched to using an on-demand approach, in which agents only receive their behavior data when they are actually performing them. The behavior possibility space isn't a concern now, but it does require making structural changes. <-- and just to be clear, this approach has been performing very fast. I'm just trying to figure out if-or-how we could take advantage of this new enable/disable approach.

    - - -

    Sincerely, thanks for your time. I'm excited for this feature. :)
     
    Last edited: Jun 3, 2020
  9. Joachim_Ante

    Joachim_Ante

    Unity Technologies

    Joined:
    Mar 16, 2005
    Posts:
    5,203
    Yes, that is further out. Right now no one assigned to it specifically.

    L1 cache size was never part of the choice. It was mostly just trade-off of potentially wasted memory when chunks aren't full vs the overhead of processing lots of small chunks vs chunk change versions granularity.

    And thats totally fine. If we are talking about low frequency behaviour type changes it can totally make sense to continue to use AddComponent / RemoveComponent to keep data and layout tight.

    There are clearly trade-offs with the approach. When you get to the stage where you really need to make perf & memory cost optimal, you will just have to profile and mix and match. With the approach we are taking you can do that without changing all your game code that reacts to those components. So it is easy to do late in the process of optimizing your game.
     
    bb8_1, Dinamytes, pahe and 6 others like this.
  10. PublicEnumE

    PublicEnumE

    Joined:
    Feb 3, 2019
    Posts:
    729
    Thank you! That answers a lot.
     
    Last edited: Jun 4, 2020
  11. LudiKha

    LudiKha

    Joined:
    Feb 15, 2014
    Posts:
    138
    lclemens, Abbrew, Dinamytes and 5 others like this.
  12. PublicEnumE

    PublicEnumE

    Joined:
    Feb 3, 2019
    Posts:
    729
    Here’s hoping this feature lands in the not-to-distant future. :)
     
  13. Orimay

    Orimay

    Joined:
    Nov 16, 2012
    Posts:
    304
    Is this still planned?
     
  14. Shinyclef

    Shinyclef

    Joined:
    Nov 20, 2013
    Posts:
    478
    Here's hoping that any feature lands in the not-too-distant future :D.
     
    Orimay and thelebaron like this.
  15. hidingspot

    hidingspot

    Joined:
    Apr 27, 2011
    Posts:
    87
    Even just some more communication/info about DOTS plans would be much appreciated.
     
  16. RecursiveEclipse

    RecursiveEclipse

    Joined:
    Sep 6, 2018
    Posts:
    298
    Preaching to the choir, DOTS devs are hiding in trees and we're all dogs running through the forest barking randomly. Sometimes one will come down and yell in our general direction and then disappear into the shadows.
     
  17. hippocoder

    hippocoder

    Digital Ape Moderator

    Joined:
    Apr 11, 2010
    Posts:
    29,723
    If you have a question about DOTS right now then feel free to make a thread, but there is not much chance of any speculation about future things.
     
  18. Guedez

    Guedez

    Joined:
    Jun 1, 2012
    Posts:
    823
    Nice, this should vastly increase Tag-like component performance, since you can add all tags that 'might' be added to a component, and then just enable/disable them when relevant.
     
  19. hidingspot

    hidingspot

    Joined:
    Apr 27, 2011
    Posts:
    87
    Setting aside any hopes of plans or a roadmap being shared, I'd love to hear more about the active state of development regarding DOTS. Does anyone know if that info is available anywhere? I wouldn't want to make a new thread if I'm just not looking in the right place.
     
    Orimay likes this.
  20. thelebaron

    thelebaron

    Joined:
    Jun 2, 2013
    Posts:
    825
    We all would, trust me.
     
  21. hippocoder

    hippocoder

    Digital Ape Moderator

    Joined:
    Apr 11, 2010
    Posts:
    29,723
    The sticky posts would be my first go-to.
     
  22. RecursiveEclipse

    RecursiveEclipse

    Joined:
    Sep 6, 2018
    Posts:
    298
  23. hidingspot

    hidingspot

    Joined:
    Apr 27, 2011
    Posts:
    87
    That's a good suggestion, thanks. Though, I do generally check in on the forum, discord server, and youtube multiple times a day, so I was kind of hoping that I just hadn't seen another good place/site to follow.
     
  24. MostHated

    MostHated

    Joined:
    Nov 29, 2015
    Posts:
    1,218
    100% can't wait for this feature. It will eliminate the need for so many workarounds and hack-togethers.
     
  25. Abbrew

    Abbrew

    Joined:
    Jan 1, 2018
    Posts:
    417
    Will this be in the next release of Entities?
     
  26. fcorbel

    fcorbel

    Joined:
    Oct 27, 2016
    Posts:
    7
    Hi there ! I was wondering if there is any news about this in 0.5 ?
     
    PeppeJ2 likes this.
  27. Krajca

    Krajca

    Joined:
    May 6, 2014
    Posts:
    347
    AFAIK it will be part of 1.0.
     
    fcorbel likes this.
  28. PublicEnumE

    PublicEnumE

    Joined:
    Feb 3, 2019
    Posts:
    729
    I’m very interested to know how this will be implemented.

    I assume that this change will make zero-sized components no longer zero-sized. Seems like they would at least have to add 1 bit of size to each entity.

    that’s not a big deal if you have a small number of tag components. But if you have 300, then chunk efficiency will suddenly take a big hit.
     
  29. OffgridChris

    OffgridChris

    Joined:
    May 20, 2021
    Posts:
    17
    Any chance the Enable/Disable feature will be in Entities v0.51? I too was hoping it would come in v0.50 and v1 still sounds like a long way off...
     
  30. tertle

    tertle

    Joined:
    Jan 25, 2011
    Posts:
    3,626
    Not unity but their Gdc slide had it as a feature of 1.0
     
    OffgridChris likes this.
  31. cort_of_unity

    cort_of_unity

    Unity Technologies

    Joined:
    Aug 15, 2018
    Posts:
    97
    Hello! My team and I have been doing a ton of work lately to get the enableable-components feature ready for 1.0, and I'd be happy to answer some of the questions I see in this thread. The realities of implementation have led to a few more constraints than what Joachim described back in 2020, but overall what he described is pretty much what we're aiming to deliver.

    Each individual component type will have to opt into being enableable, by implementing the
    IEnableableComponent
    interface. There are some components where being disabled just doesn't make sense, so this gives us a way to avoid some nonsensical cases. Currently, this interface can only be used with
    IComponentData
    and
    IBufferElementData
    . It may be extended to additional component flavors if there's sufficient demand, but in general if we had to ask ourselves "what would it mean to disable this component?" and the answer wasn't immediately and unambiguously obvious, we kept it off the list for now.

    The per-component bits are not stored in the chunks themselves (they're part of the
    ArchetypeChunkData
    , if you're curious). There were compelling pros & cons for both approaches, but this is the one we ended up with. So, the good news is that the bits themselves don't affect chunk utilization, and zero-size components are still zero-size as far as chunk data is concerned. One related change we did make for 1.0 is putting an artificial cap of 128 entities per chunk, to simplify and optimize the enabled-bits processing code (128 bits = one 16-byte SIMD register). Previously you could have a chunk capacity as high as 2048 under pathological conditions, but in practice almost every archetype we've seen is already comfortably below the new capacity limit, so we don't expect this to result in too many additional chunks.

    For those concerned about iteration performance over a sparse list of entities with disabled components: to echo & build on Joachim's answer, structural changes will still be available if you need them, and in some cases will still be the best tool for the job. This is about offering another option, so you can pick the best approach for your specific use case (without needing to rearchitect the higher-level gamecode). Yes, if you reach the point where you're iterating over 100,000 entities and only 100 of them have enabled the components you care about, then that's a huge waste; maybe it'd be better to move those 100 entities to their own archetype. If entities are changing state very infrequently, then it probably makes sense to add/remove components instead of enabling/disabling them. If adding every possible component that might ever be needed results in an uber-entity that no longer fits in a 16KB chunk...well, don't do that then. But y'all, structural changes are slow, and flipping a single bit from job code is (relatively) pretty fast. As a concrete example, we have a performance test that compares two sequences of operations:
    1. Schedule a parallel job to record an
      EntityCommandBuffer
      that removes
      MyComponent
      from half of all entities.
    2. Wait for the job to complete, and play back the command buffer.
    3. Schedule a parallel job to process all entities with
      MyComponent
      .
    4. Wait for jobs to complete.
    vs.
    1. Schedule a parallel job to disable
      MyEnableableComponent
      on half of all entities.
    2. Schedule a parallel job to process all entities with
      MyEnableableComponent
      enabled.
    3. Wait for jobs to complete.
    The second sequence is ~9x faster. I'm very excited to have that option on the table.
     
    Last edited: May 3, 2022
  32. cort_of_unity

    cort_of_unity

    Unity Technologies

    Joined:
    Aug 15, 2018
    Posts:
    97
    One last thing I'd like to mention: eagle-eyed readers may note the presence of many of these new enableable-component-related API calls in the 0.5x Entities release, all marked as
    internal
    . You may be tempted to locally flip these methods to
    public
    to start playing with this feature in your own projects prior to its official release. I want to advise you in the strongest, most sympathetic terms: please, for your own sake, don't do that. That road leads to nothing but pain.

    We'll make it public when it's ready, I promise :)
     
    bb8_1, Orimay, Rupture13 and 20 others like this.
  33. tertle

    tertle

    Joined:
    Jan 25, 2011
    Posts:
    3,626
    Too late :cool: Played with it a bit last week in an empty project - not because I expect it to work but just because I wanted to get a feel for the work flow to ensure I was designing certain systems the right way for a future painless switchover. Very happy it's opt in with IEnableableComponent and in general how it's been setup. Obviously things might change before 1.0 and I take all my testing with a grain of salt.

    One observation I had was with the SetComponentEnabled on ComponentDataFromEntity which suggest that enabled states can be changed on the fly without the need for main thread/deferring them. This sounds great for a lot of cases however it also has the side effect that other filters have - that without a sync point you can not determine the number of valid entities in a query until scheduling a job. We won't be able to avoid scheduling empty jobs by early out using IsEmptyIgnoreFilter or calculating entity counts etc.

    Not a big deal, just a little concerned about users unknowingly creating sync points with things like CalculateEntityCount as I've just found filter sync points to be super annoying recently.

    So on a related note of filtering but a bit of a tangent to thread, are there any plans to make CreateArchetypeChunkArrayAsync actually async when filtering is enabled? It currently causes a sync point due to having to pre-define the length of the NativeArray.
    Is it possible for us to get a CreateArchetypeChunkArrayAsyncDeferred variate or something that returns a deferred native array [disposing this is problematic though unless you force it onto World.UpdateAllocator] or just make it return a native list instead. I already wrote a proof of concept and found that apart from no longer causing unexpected sync points it significantly reduced main thread cost

     
    Last edited: May 4, 2022
    bb8_1, JesOb, Krooq and 3 others like this.
  34. DreamingImLatios

    DreamingImLatios

    Joined:
    Jun 3, 2017
    Posts:
    3,983
    This seems very similar but slightly different to what I have been doing with chunk components and as such I do wonder if the approach taken here might be slightly inferior. With chunk components, I can do metachunk iteration which is useful for some algorithms like a parallel prefix sum. In addition, the default is "disabled" for new entities which is nice because a reactive system can explicitly query for and initialize new entities while most systems only have to worry about the "enabled" entities. Are similar capabilities planned?

    Also, 9X seems slow. I've seen closer to 30-50x speedups with chunk components.
     
    bb8_1, Timboc and Krajca like this.
  35. cort_of_unity

    cort_of_unity

    Unity Technologies

    Joined:
    Aug 15, 2018
    Posts:
    97
    Yes, components can be enabled/disabled in a job with no sync points. This is simultaneously the best part of this feature and its biggest (potential) pitfall. Several operations (such as
    IsEmpty
    and
    CalculateEntityCount
    ) may now potentially sync on running jobs in order to return accurate results. FWIW we consider enableable components to be a form of "filtering", so functions with a "NoFilter" or "IgnoreFilter" variant will not require a sync point, at the cost of returning an efficient and conservative upper bound. Yes,
    IsEmptyIgnoreFilter
    may return false and cause you to schedule a job, only to discover that there's actually nothing to process; we don't think that will be the common case.

    I've recently finished updating the similar functions
    ToEntityArrayAsync()
    and friends to be truly asynchronous in light of the enableable-component changes. One of the necessary changes was that they now return a
    NativeList
    instead of a
    NativeArray
    , since the size of their output won't be known until the job completes. It looks like
    CreateArchetypeChunkArrayAsync()
    should get the same treatment.
     
    Last edited: May 4, 2022
    bb8_1, PhilSA, eizenhorn and 5 others like this.
  36. cort_of_unity

    cort_of_unity

    Unity Technologies

    Joined:
    Aug 15, 2018
    Posts:
    97
    Not at the moment, no. We default all new components to enabled (with the exception of prefabs, where instantiated instances copy the enabled/disabled state from the prefab). Marking certain components as disabled-by-default is an interesting idea; we'll give it some thought.

    We're talking about totally different benchmarks on totally different hardware, so I'd expect some variation. It sounds like we broadly agree that the code gets much faster without sync points :)
     
    bb8_1, eizenhorn, davenirline and 2 others like this.
  37. JesOb

    JesOb

    Joined:
    Sep 3, 2012
    Posts:
    1,081
    Hi @cort_of_unity.
    thanks for this details :)

    Can you say more about decision to make not all components to have enable bit? How exactly pros and cons looks like?

    I see that with current solution enable/disable no more replacement of add/remove because i can add/remove any component in project (home made or 3rd party one) but can enable/disable only small part that was explicitly designed for it.

    So if some 3rd party lib designed around add/remove I can not switch it to enable/disable in late development phase when try to optimize something just because enable disable use different api to work with. Looks like changing internals of 3rd party to add IEnableableComponent to component will not help.

    Can you please describe more about:
    How it will be actually doable?

    And the last question about 128 entities cap on chunk. This means that if entity is smaller than 128 bytes then we just waste space because entity can not be smaller than 16KB / 128. With this new limitation we want to have smaller chunk sizes once again. If we can use chunks of 4KB for some entities than each entity will be 32 bytes in size - 8 bytes for id = 24 bytes of actual data that can be something like 12b velocity and 12b of metadata for fast processing.
    Do UT still consider to add option to have smaller chunk sizes?
     
  38. DreamingImLatios

    DreamingImLatios

    Joined:
    Jun 3, 2017
    Posts:
    3,983
    Fun fact, if your entity has a LocalToWorld component, then you are guaranteed to use over half the chunk's memory when maxing out, as LocalToWorld + Entity = 72 bytes.
     
  39. runner78

    runner78

    Joined:
    Mar 14, 2015
    Posts:
    760
    I think dynamic chunk size would be optimal, depending on the size of the archetype, the chunk size should be adjusted automatically 4K/8K/16K/32K.
     
    JesOb likes this.
  40. davenirline

    davenirline

    Joined:
    Jul 7, 2010
    Posts:
    943
    I'm excited! I have a bunch of frameworks that are ready to utilize this. No more checking for "if(component.enabled)".
     
  41. runner78

    runner78

    Joined:
    Mar 14, 2015
    Posts:
    760
    The entity itself is not stored in the Chunks, as far i remember, only the component data and the header. The header would also have to be accounted for in the chunk capacity for the actual component memory. Except that was changed and the actual chunk size was adjusted.
     
  42. tertle

    tertle

    Joined:
    Jan 25, 2011
    Posts:
    3,626
    The entity itself does take space in the chunk
    upload_2022-5-4_18-49-17.png
     
    hippocoder likes this.
  43. runner78

    runner78

    Joined:
    Mar 14, 2015
    Posts:
    760
    Either that was changed, it is displayed incorrectly, or I overlooked it in the code when I looked at how unity manages the data in the chunks a while ago.
     
  44. Guedez

    Guedez

    Joined:
    Jun 1, 2012
    Posts:
    823
    Considering how similar ECS is to Databases, why not add support for 'Chunk Indexes' like one can add indexes for tables in databases? Would the performance cost of maintaining the index invalidate it's benefits?
     
  45. eizenhorn

    eizenhorn

    Joined:
    Oct 17, 2016
    Posts:
    2,653
    It was from the beginning
     
  46. runner78

    runner78

    Joined:
    Mar 14, 2015
    Posts:
    760
    This could make structural changes even more costly as all indices need to be changed. the index would also have to be updated with every change in components. I don't know to what extent that makes sense, since an index only makes sense if you also want a filter by value. It could well be that a simple iteration over all data is faster because it is more cache-friendly.
     
  47. optimise

    optimise

    Joined:
    Jan 22, 2014
    Posts:
    2,029
    @cort_of_unity How about mega chunk and tiny chunk feature at 1.0 release? I really need this feature that it's essential feature at dots netcode project since it already consume lots of space at chunk at default network entity before I start to add my own components.