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

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


    Apr 17, 2016
    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.