Example #1
0
        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);
            }
        }
Example #2
0
        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);
            }
        }