2011-03-03 1 views
2

Je suis peu à peu, se déplaçant péniblement de traitement à Flash afin de développer, espérons-jeux à un public plus large. Enfin, j'ai une application de travail en Flash qui permet à l'utilisateur de cliquer pour créer des blocs qui gravitent ensuite vers la souris. J'ai fait exactement la même chose dans Processing, juste pour comparer les vitesses. Cependant, lorsque je lance la version Flash et que j'ajoute environ 15-20 blocs, le framerate chute à 5-10 FPS. Dans la version de traitement, je peux ajouter ~ 60 sans ralentissement notable. Quel est le problème, Flash?application Flash test simple fonctionne très lentement par rapport à l'applet même traitement exacte

Liens vers la source de chaque version:

Flash version

Processing version

Voici la source pour chacun dans le cas où vous êtes un assistant et peut aider juste en glowering le code ton sévère et dire à se comporter:

Version 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(); 
     } 

    } 

} 

version Traitement:

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(); 
    } 
} 

Merci de votre aide!

+0

'graphics.clear();' – www0z0k

Répondre

2

Un problème est que pour chaque exécution de .run vous redessiner boîte graphique de l'image-objet, mais l'image-objet ne change pas du tout au fil du temps. Il suffit donc de dessiner une fois dans le constructeur.

Mais que faire si DO devez redessiner chaque image pour une raison quelconque? Peut-être changer la couleur de la boîte au fil du temps? Eh bien, vous négligez d'effacer votre ancienne image ... donc chaque image que vous ajoutez juste de plus en plus de points vectoriels aux objets graphiques. Donc, en réalité, alors qu'il semble que vous avez juste un carré noir, vous avez en réalité des milliers de carrés noirs de données après seulement quelques secondes. Vous pouvez effacer les graphiques objet comme celui-ci ...

this.graphics.clear(); 

En tant que micro optimisation, vous pouvez attribuer this.graphics à une variable locale ...

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

Une autre chose que je remarque est que vous ne semblez pas avoir de mouvement basé sur le temps, mais plutôt basé sur le cadre. Les blocs eux-mêmes n'ont aucune idée du temps qui s'est écoulé, alors ils vont ralentir. L'alternative est de baser leur mouvement sur le temps écoulé, ce qui les fera bouger à la bonne vitesse, mais l'application laissera tomber les cadres pour le faire.

Puisqu'il s'agit d'une boîte à laquelle vous avez affaire, vous pouvez aussi utiliser graphics.drawRect() au lieu de dessiner une boîte ligne par ligne.

Dans mes propres tests, l'option 1 fonctionnait le mieux. Si vous devez redessiner, assurez-vous de faire des graphiques.clear(), car cela fonctionne presque aussi bien pour un grand nombre de boîtes.

EDIT pour ajouter ...

Votre exemple, après avoir ajouté les appels de fonction .clear() n'effectue très bien. Je devrais cependant vous avertir que la JVM va certainement avoir de meilleures performances que Flash Player. Cela ne veut pas dire que les gens ne peuvent pas faire des applications Flash très performantes, mais que le plafond des performances dans Flash Player pour le rendu du processeur est beaucoup plus faible que celui de Java. Bien sûr, si vous êtes prêt à vivre sur le bord saignant, vous pouvez consulter les nouvelles apis 3D "Molehill" qui sont capables de choses comme ça ...

3D game on the Wii ported to Flash using molehill, running at 60fps http://blog.theflashblog.com/ ? p = 2593

+0

Ah, merci. J'étais sous l'impression que le tampon graphique a été effacé chaque image par défaut. Je ne suis toujours pas habitué à chaque objet ayant son propre calque graphique ... Edit: J'ai essayé votre solution (en déplaçant le code graphique vers le constructeur) et cela a fonctionné comme un charme. Merci beaucoup! –

Questions connexes