Search Unity

  1. We are migrating the Unity Forums to Unity Discussions. On July 12, the Unity Forums will become read-only.

    Please, do not make any changes to your username or email addresses at id.unity.com during this transition time.

    It's still possible to reply to existing private message conversations during the migration, but any new replies you post will be missing after the main migration is complete. We'll do our best to migrate these messages in a follow-up step.

    On July 15, Unity Discussions will become read-only until July 18, when the new design and the migrated forum contents will go live.


    Read our full announcement for more information and let us know if you have any questions.

Bug Physics2D.DestroyShapes() has an enormous impact on performances even when very few Physics Shapes E

Discussion in 'Editor & General Support' started by Naotagrey, Nov 30, 2021.

Thread Status:
Not open for further replies.
  1. Naotagrey

    Naotagrey

    Joined:
    Apr 17, 2016
    Posts:
    37
    In my project, I'm allowing users to control some settings influencing the spawn of objects.

    I have some objects that fuse when they collide with one another.

    Under some settings, a lot of those objects can be created very close to one another, leading to a lot of initial fusions. This causes a big initial lag spike, as expected since there's a lot of objects being created than destroyed.

    However, afterward, even if only very few of those big fused objects remain (like ~10 of them), and very few fusions are happening (1 every few frames), the performances remain very bad (2-3 fps).

    Looking at the profiler, it seems like the culprit is Physics2D.DestroyShapes(), which can be called multiple hundred times per frame, with a cost of ~1ms for each call. The multiple DestroyShapes() are called From Physics2d.SyncTransformChanges(), which is itself called from either Physics2D.Simulate(), or another function where My Agents use OverlapCircleNonAlloc(), but only the first time it's called?? Which of the two will call SyncTransformChanges() depends on the timeSpeed I set?

    This doesn't make sense to me... I've seen in some other thread that this can be linked to modifying transform.position instead of rb2d.transfrom.position, but I've reviewed my code and I don't find any instance of this in the related scripts.


    Weird Thing: Disabling the fuse on collision so that they just collide like any other objects, we still get the initial lag spike as expected with the enormous amount of collisions, but once all the collisions are resolved and the objects separate we return back to normal performances.
    Even weirder, saving the game, then loading it right away, doesn't solve anything, but returning to the menu (changing scene), then loading the same game now works fine and the performances are back to normal (>60 fps), even if the same rate of object fusion (when an item is spawned into one of the giant items and fuses with it).


    This seems to indicate that some things are not destroyed properly when a lot of objects with colliders/rigidbodies (All 2D) are spawned and destroyed at once.


    Any Thoughts/Help? I would be glad if it's just something I've done and can fix. I can provide profiler data
     
Thread Status:
Not open for further replies.