Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与完全相同的处理applet相比,简单的Flash测试应用程序运行非常慢_Flash_Performance_Processing_Frame Rate - Fatal编程技术网

与完全相同的处理applet相比,简单的Flash测试应用程序运行非常慢

与完全相同的处理applet相比,简单的Flash测试应用程序运行非常慢,flash,performance,processing,frame-rate,Flash,Performance,Processing,Frame Rate,因此,我正逐渐地,痛苦地从处理转移到Flash,以期为更广泛的观众开发游戏。最后,我得到了一个用Flash制作的工作应用程序,它只允许用户点击创建块,然后吸引鼠标。我在处理过程中也做了同样的事情,只是为了比较速度。但是,当我运行Flash版本并添加大约15-20个块时,帧速率下降到5-10 FPS。在处理版本中,我可以添加~60,没有明显的减速。怎么回事,Flash 指向每个版本源的链接: 以下是每种情况的源代码,如果您是一个向导,只需严厉地怒视代码并告诉其行为即可: 闪存版本: block

因此,我正逐渐地,痛苦地从处理转移到Flash,以期为更广泛的观众开发游戏。最后,我得到了一个用Flash制作的工作应用程序,它只允许用户点击创建块,然后吸引鼠标。我在处理过程中也做了同样的事情,只是为了比较速度。但是,当我运行Flash版本并添加大约15-20个块时,帧速率下降到5-10 FPS。在处理版本中,我可以添加~60,没有明显的减速。怎么回事,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 );
}
处理版本:

草图\u 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 );
}

谢谢你的帮助

一个问题是,每次执行.run时,您都会重新绘制精灵的图形框,但精灵始终不会改变。所以只要在构造函数中绘制一次就足够了

但是如果你真的因为某种原因不得不重画每一帧呢?也许随着时间的推移改变盒子的颜色?你忘了清理你的旧形象。。。因此,每一帧,你只需向图形对象添加越来越多的向量点。所以在现实中,虽然看起来你只有一个黑方块,但实际上在几秒钟后,你就有了数千个黑方块的数据。您可以像这样清除图形对象

this.graphics.clear();
作为微观优化,您可以将此.graphics分配给局部变量

var g:Graphics = this.graphics
g.moveTo(0); // and so on...
我注意到的另一件事是,你似乎没有基于时间的运动,而是基于帧的。块本身不知道经过了多少时间,所以它们会减速。另一种方法是根据经过的时间来移动它们,这将使它们以正确的“速度”移动,但应用程序会删除帧来执行此操作

因为这是您正在处理的一个长方体,所以您还可以使用graphics.drawRect()代替逐行绘制长方体

在我自己的测试中,选项1效果最好。如果您确实需要重画,请确保执行graphics.clear(),因为即使对于大量的框,这也几乎同样有效

编辑以添加

在添加.clear()函数调用后,您的示例的性能确实非常好。不过,我应该提醒您,JVM肯定会比Flash播放器具有更好的性能。这并不是说人们不能制作高性能的Flash应用程序,而是说Flash播放器在处理CPU渲染时的性能上限比Java要低得多。当然,如果你愿意生活在最前沿,你可以看看新的“Molehill”3D API,它可以实现这样的功能


http://blog.theflashblog.com/?p=2593

啊,谢谢你。我的印象是,默认情况下,图形缓冲区在每一帧都被清除。我仍然不习惯每个对象都有自己的图形层。。。编辑:尝试了你的解决方案(将图形代码移动到构造函数中),效果非常好。非常感谢!
this.graphics.clear();
var g:Graphics = this.graphics
g.moveTo(0); // and so on...