1

我在一个网站上有几部 Flash 电影。它们都循环播放一个持续约 15 秒的动画(但这不是一成不变的)。它们都同时开始播放并且同步。

但是,当我调整浏览器窗口大小或滚动页面时,如果 Flash 播放器实例不在视口中,它将停止播放。当它返回到视口时,它会恢复并随后与其他 Flash 播放器实例不同步。

我的印象是这是一个 Flash 播放器优化。是否有可能通过 JS / AS3 禁用这种行为?它似乎发生在 Windows 上的 Firefox 和 Chrome 中。

更新

只是为了澄清。我有使用本地连接和 ExternalInterface 同步广告的方法。我正在寻找的是一种禁用FlashPlayer 的“优化”的方法,这会导致帧速率大大降低。

4

3 回答 3

2

您不能禁用此功能。当 Flash 应用程序不可见时,它可以降低内存和 CPU 使用率。

不过,您可以使用的是称为 Throttle API 的东西。这是一个专用 API,旨在让 Flash 应用程序的创建者能够在他们的应用程序将要减速/节流时得到准确的通知。

这是一个例子。

addEventListener(ThrottleEvent.THROTTLE, onThrottleEventHandler);

function onThrottleEventHandler(e:ThrottleEvent):void
{
    if(e.state == ThrottleType.THROTTLE)
    {
        /**
         * the player is about to be slowed down to a frame rate
         * set in e.targetFrameRate
         */
    }
    else if(e.state == ThrottleType.PAUSE)
    {
        /**
         * the player is going to be paused completely, AKA 0 fps
         */
    }
    else if(e.state == ThrottleType.RESUME)
    {
        /**
         * the player is now back to normal as it has resumed
         * from the paused or throttled state
         */
    }
}

现在您可以找出最适合您的方法,但我的建议是存储通过以下方式限制或暂停时经过的当前时间:

currentTime = getTimer();

然后使用以下命令计算您的应用程序恢复后经过了多长时间:

passedTime = getTimer() - currentTime;

然后用这些信息做你喜欢的事情。

希望这对您有所帮助,既然您熟悉了 Throttle API,应该可以为您提供更大程度的控制。有关它的更多信息,请在此处的文档中查看:ThrottleEvent

于 2012-12-05T13:16:02.370 回答
0

如果每个 SWF 同时进行非常重要,我会通过 JavaScript 控制它。

假设每个 SWF 文件都是一个简单的 MovieClip,我会这样做:

将每个 FLA 文件的 Document Class 设置为:

package {
    import flash.display.MovieClip;
    import flash.external.ExternalInterface;

    public class ExternalInterfaceControlledMC extends MovieClip {

        public function ExternalInterfaceControlledMC() {
            this.stop();
            if (ExternalInterface.available) {
                try {
                    ExternalInterface.addCallback("setFrame", jsSetFrame);
                } catch (error:Error) {
                    trace("An Error occurred:", error.message);
                }
            } else {
                trace("ExternalInterface is not available");
            }
        }

        private function jsSetFrame(value:String):void {
            var frameNumber = int(value) % this.totalFrames;
            this.gotoAndStop(frameNumber);
        }
    }
}

在 JavaScript 中,您可以将每个 SWF 实例的引用添加到数组中,然后使用计时器告诉每个 SWF 前进到帧号。

var swfElements; //Array
var currFrame = 1;

function onPageLoad() {
    //Init timer
    setInterval("progressFrame", 1000 / 30); //30 fps
}

function progressFrame() {
    for (var i = 0; i < swfElements.length; i++) {
        swfElements[i].setFrame(currFrame);
    }
    currFrame++;
}

请注意,此代码没有经过任何测试,仅用于说明我的思路。

于 2012-12-04T22:45:02.367 回答
0

我相信这种行为是正常的,它是一种从未修复过的闪存错误。

我相信 inha 可能有 ua 解决方案,但不是在 enter_frame 事件中。那简直太残忍了。

我要做的是:

创建一个计时器事件.. 每 X 秒.. 所以它会在我的 checkFunction() 中调用一个 checkFunction。我会检查我的所有电影剪辑是否都已同步。如果我发现 1 不是 .. 我会放一个简单的 gotoAndPlay(xFrame);

    var aMovieClips:Array; //get all ur movieclips into this array.

    var timeToCheck = 1000; //time to check for a unsincronized movieclip
    var time:Timer=new Timer(timeToCheck,0);//do inifinite call each 1000 seconds
    time.start();
    time.addEventListener(TimerEvent.TIMER, checkFunction);

    public function checkFunction(e:TimerEvent):void
    {
    var aCurrentFrames:Array;
    for (var n:int = 0;n<aMovieClips.length();n++)
        aCurrentFrames.push(aMovieClips[n].currentFrame);
    //so now u have all current frames of all movie clips.. so u can add a
    //gotoAndPlay(x); to any unsyncronized movieclip  
    }
于 2012-12-04T12:28:00.690 回答