2

最近,我承担了一项相当艰巨的任务,即为流行节目 Ghost Whisperer 制作交互式音乐视频。我是在项目后期加入的,遇到了一个巨大的创作文件(大约 5000 多帧长)。之前的程序员(在 AS2 中做了所有事情)基本上在时间主时间线上嵌入了一个两分半钟的 FLV,并且在某些帧点将添加剪辑以与基本的鼠标单击功能进行交互,从而触发这些剪辑播放其他剪辑带有一些flash元素和一些视频元素。

(我创建的最终版本可以在这里查看http://www.gwghostmagic.com);

作为一个整洁的怪胎,我决定在 AS3 中重建整个东西,完全放弃时间线,而是在运行时加载我的元素,这样我就有一帧而不是 5000 帧,并添加了一个 Event.ENTER_FRAME 事件侦听器来触发动作当加载的 .swf 到达某些帧时触发交互性。从程序员的角度来看,它使操作某些操作变得更加清晰和容易。问题是,事情像垃圾一样运行。

5000+ 帧版本比我的 AS3 版本加载更快,运行更​​流畅。这让我想到了一个问题,什么时候嵌入和运行时间线比运行事件侦听器更好?闪存是否更适合时间线功能?

最初,我决定构建并运行流式 .flv,但将动作同步到 .flv 是不可能的,因为 .flv 以 23.975 fps 运行,而我的 flash 电影以 24 fps 运行。唉,我被迫编译一个嵌入了 flv 的 .swf。然后将该 .swf 加载到我的主 .swf 中,其中包含将根据加载的 .swf 帧位置播放的所有功能和额外剪辑。

我注意到的一件事是 Event.ENTER_FRAME 似乎会减慢整个该死的应用程序的速度,因为在每一帧它都必须运行 200 行代码长的 if 语句列表。其中,如果整个内容被嵌入,我可能只需要插入一个关键帧,其中将实例化交互式剪辑,然后立即知道要做什么,而不是循环遍历 if else 语句。

我是不是把事情弄得又好又整洁而搞砸了?让flash成为flash更好吗?我应该寻找另一个职业吗?非常感谢任何输入。

4

2 回答 2

1

我认为让事件触发每一帧而不是仅触发动作偶尔会导致性能差异。希望您可以最大限度地减少在事件处理程序中运行的代码和条件的数量。

这是一个我没有测试过的想法:

var dispatch:Object = {
  f1:   function () {textBubble.text = "This is Rush Hour 2";},
  f61:  function () {textBubble.text = "";},
  f111: function () {textBubble.text = "This scene has 50 takes; "
                     +"Jackie Chan said \"Square Madison\" each time.";},
  f171: function () {textBubble.text = "";}
};
addEventListener(Event.ENTER_FRAME, function (e:event) {
  if (dispatch["f"+e.target.currentFrame] is Function) {
        dispatch["f"+e.target.currentFrame]();
  }
});

如实时文档中所述,这将对象用作关联数组。

于 2009-10-04T23:00:29.707 回答
1

您可能是对的 - 在每一帧上运行 200 多行代码会减慢您的速度。而不是一个巨大的语句列表,拆分你的框架函数并只调用你需要的那些 - 这是对 dlamblin 想法的扩展 - 这样你就可以运行每个框架所需的最少代码量:

function doThisOnFrame20():void
{
    //do stuff...
}

function doThisOnFrame50():void
{
    //do stuff...
}

var frameFunctions:Array = new Array();
frameFunctions[20] = doThisOnFrame20;
frameFunctions[50] = doThisOnFrame50;

function enterFrameListener(event:Event):void
{
    if(frameFunctions[swfWithFLV.currentFrame] is Function)
    {
        frameFunctions[swfWithFLV.currentFrame]();
    }
}

addEventListener(Event.ENTER_FRAME,enterFrameListener);
于 2009-10-05T02:05:18.803 回答