Тестовое приложение Simple Flash работает очень медленно по сравнению с тем же апплетом обработки - PullRequest
2 голосов
/ 03 марта 2011

Так что я постепенно, мучительно перехожу от Обработки к 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 Ответ

2 голосов
/ 03 марта 2011

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

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

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Прошить, используя кротовину, работающую со скоростью 60 кадров в секунду http://blog.theflashblog.com/?p=2593

...