feat: world now can lazy init, no longer cleans itself up #148
+64
−28
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
World has a side effect, it registers itself with the universe on init. This is fine in most cases, because dispose is called to clean this up. However, in cases like React a new world is created and discarded in a useMemo leaving side effects without any cleanup. I experimented with fixing this by implementing FinalizationRegistry with Weakrefs, allowing the world to get garbage collected and unbind its link at that point. This worked great, but it had negative performance effects everywhere the world was referenced from the universe (entity methods). This is not worth it. So instead this makes it so you can optionally create a world with a lazy option and then init it manually in an effect. This is the correct, explicit flow.