所以我逐渐地,痛苦地从加工转向Flash,以期有望向更广泛的受众开发游戏。最后,我在Flash中制作了一个工作应用程序,只需让用户点击即可创建随后倾向于鼠标的块。我在Processing中做了同样的事情,只是为了比较速度。但是,当我运行Flash版本并添加大约15-20个块时,帧速率降至5-10 FPS。在Processing版本中,我可以添加~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();
}
}
感谢您的帮助!
答案 0 :(得分:2)
一个问题是,在每次执行.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应用程序,而是在处理CPU渲染时Flash Player的性能上限远低于Java。当然,如果你愿意生活在最前沿,你可以查看新的“Molehill”3D apis,它们能够做到这一点......
3D game on the Wii ported to Flash using molehill, running at 60fps http://blog.theflashblog.com/?p=2593