public void ForceCleanup() { ParcelScene scene = null; // If we have root entities queued for removal, we call Parcel Scene's RemoveEntity() // so that the child entities end up recursively in the entitiesMarkedForCleanup queue while (rootEntitiesMarkedForCleanup.Count > 0) { // If the next scene is different to the last one // we removed all the entities from the parcel scene if (scene != null && rootEntitiesMarkedForCleanup.Peek().scene != scene) { break; } ParcelEntity parcelEntity = rootEntitiesMarkedForCleanup.Dequeue(); scene = parcelEntity.scene; scene.RemoveEntity(parcelEntity.entity.entityId, false); } while (entitiesMarkedForCleanup.Count > 0) { DecentralandEntity entity = entitiesMarkedForCleanup.Dequeue(); entity.SetParent(null); entity.Cleanup(); } if (scene != null) { GameObject.Destroy(scene.gameObject); } }
IEnumerator CleanupEntitiesCoroutine() { while (true) { float lastTime = Time.unscaledTime; ParcelScene scene = null; // If we have root entities queued for removal, we call Parcel Scene's RemoveEntity() // so that the child entities end up recursively in the entitiesMarkedForCleanup queue while (rootEntitiesMarkedForCleanup.Count > 0) { // If the next scene is different to the last one // we removed all the entities from the parcel scene if (scene != null && rootEntitiesMarkedForCleanup.Peek().scene != scene) { break; } ParcelEntity parcelEntity = rootEntitiesMarkedForCleanup.Dequeue(); scene = parcelEntity.scene; scene.RemoveEntity(parcelEntity.entity.entityId, false); if (DCLTime.realtimeSinceStartup - lastTime >= MAX_TIME_BUDGET) { yield return(null); lastTime = Time.unscaledTime; } } while (entitiesMarkedForCleanup.Count > 0) { DecentralandEntity entity = entitiesMarkedForCleanup.Dequeue(); entity.SetParent(null); entity.Cleanup(); if (DCLTime.realtimeSinceStartup - lastTime >= MAX_TIME_BUDGET) { yield return(null); lastTime = Time.unscaledTime; } } if (scene != null) { GameObject.Destroy(scene.gameObject); } yield return(null); } }