Slowndown остается после использования и удаления большого количества объектов - PullRequest
0 голосов
/ 19 июля 2011

Я застрял на этом. Я работаю над игрой. Я использую этот кусок кода, чтобы создать некую завязку с падением долга. Когда объект уничтожен, я порождаю обломки и позволяю летать по экрану. Но ... когда я часто этим пользуюсь, замедление происходит, и даже когда все объекты исчезают, замедление сохраняется. Старые добрые 50fps больше не возвращаются :( Есть ли здесь какая-то утечка памяти, которую я пропускаю? Или есть лучший способ сделать это?

public function destroyBlock(xPos,yPos,nrObjects) {

        for (var debree = 0; debree < nrObjects; debree++) {

            debreeObject = new mc_ground();
                debreeObject.x = xPos;
                debreeObject.y = yPos;
                debreeObject.scaleX = Math.random() * 0.3 + 0.1;
                debreeObject.scaleY = debreeObject.scaleX;
                debreeObject.speedX = Math.random()* 5 - 2.5;
                debreeObject.speedY = -Math.random() * 10 - 5;
            stageObject.addChild(debreeObject);

            debreeObject.addEventListener(Event.ENTER_FRAME, moveDebree);

        }

    }

    public function moveDebree(e:Event) {

        e.target.x += e.target.speedX;

        e.target.y += e.target.speedY;
        e.target.speedY += gravity;

        if (e.target.y > stageHeight) {

            e.target.removeEventListener(Event.ENTER_FRAME, moveDebree);
            e.target.parent.removeChild(e.target);
        }

    }

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Я проверил ваш код и не вижу потери производительности.Вы уверены, что это не связано с другой частью вашей игры?

Ваш код только на wonderfl

0 голосов
/ 19 июля 2011

Я бы рекомендовал реализовать Пул объектов для этого вида деятельности.Потому что создание new mc_ground() объектов замедлит работу, особенно в циклах.Выделение и освобождение памяти может быть медленным;и с помощью сборки мусора вы можете получить много вещей в памяти в любой момент времени.

Как только ваш пул создан, вы можете сделать что-то вроде debreeObject = myDebreePool.getFromPool(), что даст вам объект из пула,Затем после вызова removeChild для этого объекта, верните его в пул с чем-то вроде myDebreePool.returnToPool(oldDebreeObject).

В зависимости от ваших потребностей, вам может понадобиться пул объектов для сброса состояния объекта при возвратеЭто.В противном случае он может запомнить старые данные, которые больше не нужны.Однако, учитывая ваш пример кода, я не думаю, что это будет необходимо.

Если вы правильно реализуете свой пул объектов, вы должны увидеть значительное повышение производительности в сценарии этого типа.

...