Jump to content
  • Advertisement
Sign in to follow this  
Alundra

Unity Delete causing crash because of event, delayed delete needed ?

This topic is 646 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi,
Having an event OnCollision I can check if one collision happens but if I do "delete this;" in this event a crash happens because the update of the active transforms from physx is invalid.
Basically the physx update is :

updateScene
fetchResults
update actors with active transforms from the scene update
update actors with controllers

The only way I see to solve this issue is to add a Destroy function which delete the actor at the end of the update, like Unity does with "Destroy(this);".
Maybe same kinds of issue can happens with other situation so maybe the delayed destroy is a good way.
Another way or ideas, or this way is a good way ?
Thanks

Edited by Alundra

Share this post


Link to post
Share on other sites
Advertisement
In addition to using shared_ptr, replace "delete this;" with "Tell my owner(s) to remove me."

This kind of thing is sometimes implemented as a "return false;" inside an Update method. Whoever calls Update is either the owner or can propagate that return value upwards to the actual owner. Edited by Nypyren

Share this post


Link to post
Share on other sites

One Actor contains one physx component like SphereCollider, the physx actor is linked to the actor using the user data pointer.
The "delete this" is used in the OnCollision event of the actor when the object collide with something.
The event of the actor is called by the event callback of physx, surely on the fetchResults.
After the update + fetch of physx scene, actors are updated using the user data.
Destructor of the actor remove from the scene, so "delete this" remove from scene + delete also all components.
But since the physx actor and shape is also deleted because if you delete the actor you delete all the components too, physx crash.
One solution to avoid the "delete this" is to change one boolean to true instead of "delete this", like NeedDelete to true and delete later.
This solution is actually possible on my actual design because I use a game state with an update, but if all is managed by the scene you have to call "delete this".
It's already the case when you do a game with unreal or unity, you call destroy( this ) on the actor event / gameObject event on the same situation.
I'm not sure game-state is a correct way to continue on a modern design because you can do all with simply the scene.

Edited by Alundra

Share this post


Link to post
Share on other sites

It's already the case when you do a game with unreal or unity, you call destroy( this ) on the actor event / gameObject event on the same situation.


That's because 'Destroy(this);' does something *completely* different than 'delete this;'. :)

'delete this' is inflexible because the destructor and memory free is going to happen NOW. You are correct that you need to wait to do that until everything else is finished using the instance *or anything the destructor cleans up*.

For example, here's Unity's chart of what happens in which order:

https://docs.unity3d.com/Manual/ExecutionOrder.html


Let's say you call Destroy(this) in any of those physics-related functions. Unity marks the object to be destroyed, but does not destroy it until it gets to the very end of the frame (it calls OnDestroy, THEN actually deletes the object). The object that "got destroyed" will still be usable until that point. Edited by Nypyren

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!