Тестовое приложение Simple Flash работает очень медленно по сравнению с тем же апплетом обработки

Так что я постепенно мучительно перехожу от обработки к Flash, чтобы, надеюсь, разрабатывать игры для более широкой аудитории. Наконец-то я получил работающее приложение во Flash, которое просто позволяет пользователю щелкать мышью для создания блоков, которые затем тяготеют к мышке. Я сделал то же самое в обработке, просто для сравнения скоростей. Однако, когда я запускаю версию Flash и добавляю около 15-20 блоков, частота кадров падает до 5-10 кадров в секунду. В версии обработки я могу добавить ~60 без заметного замедления. В чем дело, Флэш?

Ссылки на источник каждой версии:

Flash версия

Обработка версии

Вот источник для каждого, если вы - волшебник и можете помочь, просто посмотрев на код строго и сказав, что он ведет себя:

Flash версия:

blocks.fla

import flash.events.Event;
import flash.display.MovieClip;

stage.addEventListener( Event.ENTER_FRAME, onenter );
stage.addEventListener( MouseEvent.MOUSE_DOWN, onclick );

var main = this;

var lastFrame:Number;

var Blocks:Array = new Array();

function onenter( e:Event ):void
{
    var time:Number = getTimer();
    for( var i = 0; i < Blocks.length; i++ )
    {
        Blocks[ i ].run();
    }
    FrameRate.text = String( Blocks.length ) + "\n" + String( 1000 / ( time - lastFrame ) );
    lastFrame = time;
}

function onclick( e:MouseEvent ):void
{
    var block1 = new Block( Blocks, main, mouseX, mouseY );
}

Block.as

package  {

    import flash.display.MovieClip;
    import flash.geom.Vector3D;

    public class Block extends MovieClip {

        var velocity:Vector3D = new Vector3D( 0, 0 );
        var position:Vector3D = new Vector3D( x, y );
        var acceleration:Vector3D = new Vector3D( 0, 0 );

        public function Block( Blocks:Array, This, x:Number, y:Number ) {
            Blocks.push( this );
            This.addChild( this );
            position.x = x;
            position.y = y;
        }

        public function run()
        {
            x = position.x;
            y = position.y;
            //position.incrementBy( velocity );
            position.x += velocity.x;
            position.y += velocity.y;
            acceleration.x = stage.mouseX - position.x;
            acceleration.y = stage.mouseY - position.y;
            acceleration.normalize();
            //velocity.incrementBy( acceleration );
            velocity.x += acceleration.x;
            velocity.y += acceleration.y;
            velocity.x *= 0.95;
            velocity.y *= 0.95;
            this.graphics.beginFill( 0 );
            this.graphics.moveTo( -10, -10 );
            this.graphics.lineTo( 10, -10 );
            this.graphics.lineTo( 10, 10 );
            this.graphics.lineTo( -10, 10 );
            this.graphics.lineTo( -10, -10 );
            this.graphics.endFill();
        }

    }

}

Версия обработки:

sketch_mar02b.pde

Block[] blocks = new Block[ 0 ];

void setup()
{
  frameRate( 60 );
  size( 550, 400 );
  textFont( createFont( "Verdana", 20 ) );
}

void draw()
{
  background( 255 );
  for( int i = 0; i < blocks.length; i++ )
  {
    blocks[ i ].run();
  }
  text( blocks.length + "\n" + frameRate, 0, 20 );
}

void mousePressed()
{
  new Block( mouseX, mouseY );
}

Block.pde

class Block
{
  PVector position = new PVector( 0, 0 );
  PVector velocity = new PVector( 0, 0 );
  PVector acceleration = new PVector( 0, 0 );
  Block( float x, float y )
  {
    position.set( x, y, 0 );
    blocks = ( Block[] ) append( blocks, this );
  }
  void run()
  {
    position.add( velocity );
    acceleration.set( mouseX - position.x, mouseY - position.y, 0 );
    acceleration.normalize();
    velocity.add( acceleration );
    velocity.mult( 0.95 );
    pushMatrix();
    translate( position.x, position.y );
    fill( 0 );
    rect( -10, -10, 20, 20 );
    popMatrix();
  }
}

Спасибо за помощь!

1 ответ

Решение

Одна проблема заключается в том, что при каждом запуске.run вы перерисовываете графическое поле спрайта, но спрайт не меняется со временем. Так что одного рисования в конструкторе достаточно.

Но что если вам по каким-то причинам придется перерисовывать каждый кадр? Может быть, со временем поменять цвет коробки? Ну, вы пренебрегаете очисткой своего старого изображения... поэтому каждый кадр вы просто добавляете все больше и больше векторных точек в графические объекты. Таким образом, в действительности, если у вас есть только один черный квадрат, на самом деле вы получаете тысячи черных квадратов данных всего за несколько секунд. Вы можете очистить графический объект, как это...

this.graphics.clear();

В качестве микрооптимизации вы можете назначить this.graphics локальной переменной...

var g:Graphics = this.graphics
g.moveTo(0); // and so on...

Еще одна вещь, которую я замечаю, это то, что у вас нет движения по времени, а скорее по кадрам. Сами блоки не знают, сколько времени прошло, поэтому они будут тормозить. Альтернатива состоит в том, чтобы основывать свое движение на истекшем времени, что будет держать их с правильной "скоростью", но приложение будет сбрасывать кадры, чтобы сделать это.

Поскольку вы имеете дело с этим блоком, вы также можете использовать graphics.drawRect() вместо того, чтобы рисовать блок построчно.

В моем собственном тестировании вариант 1 работал лучше всего. Если вам нужно перерисовать, обязательно сделайте graphics.clear(), так как он работает почти так же хорошо даже для большого количества блоков.

РЕДАКТИРОВАТЬ, чтобы добавить...

Ваш пример после добавления вызовов функции.clear () работает очень хорошо. Однако я должен предупредить вас, что JVM наверняка будет иметь лучшую производительность, чем Flash Player. Это не означает, что люди не могут создавать высокопроизводительные приложения Flash, но верхний предел производительности в Flash Player при работе с рендерингом процессора намного ниже, чем в Java. Конечно, если вы хотите жить на переднем крае, вы можете проверить новый 3D-интерфейс "Molehill", способный на такие вещи...

3D-игра на Wii, портированная на Flash с использованием крота, работает на скорости 60 кадров в секунду http://blog.theflashblog.com/?p=2593

Другие вопросы по тегам