1

私はサイトにいくつかのフラッシュムービーを持っています。それらはすべて、約15秒間続くアニメーションをループします(ただし、これは石に設定されていません)。それらはすべて同時に再生を開始し、同期しています。

ただし、ブラウザウィンドウのサイズを変更したり、ページをスクロールしたりすると、Flash Playerインスタンスがビューポートにない場合、再生が停止します。ビューポートに戻ると、再開し、その後、他のFlashPlayerインスタンスと同期しなくなります。

私はこれがフラッシュプレーヤーの最適化であるという印象を受けています。とにかく、おそらくJS / AS3を介して、この動作を無効にする方法はありますか?これは、FirefoxとWindows上のChromeで発生するようです。

アップデート

明確にするために。ローカル接続とExternalInterfaceを使用して広告を同期する方法論を用意しています。私が探しているのは、FlashPlayerの「最適化」を無効にして、フレームレートを大幅に下げる方法です。

4

3 に答える 3

2

この機能を無効にすることはできません。フラッシュアプ​​リケーションが表示されていないときにメモリとCPUの使用量を減らすために配置されています。

ただし、利用できるのはThrottleAPIと呼ばれるものです。これは、Flashアプリケーションの作成者が、アプリケーションの速度が低下/抑制されたときに正確に通知できるようにするために作成された専用のAPIです。

これが例です。

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

私は、この種の動作は通常の動作であり、修正されたことのないフラッシュのバグであると信じています。

私はinhaがuaソリューションを取得する可能性があると信じていますが、enter_frameイベントでは取得できません。それはただ残忍です。

私がすることは:

タイマーイベントを作成します。X秒ごとに..checkFunction()でcheckFunctionを呼び出します。すべてのmovieClipsが同期されているかどうかを確認します。そして、そうでないものが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 に答える
0

各SWFが同時に進行することが非常に重要な場合は、JavaScriptで制御します。

各SWFファイルが単純なMovieClipであると仮定すると、次のようになります。

各FLAファイルのドキュメントクラスを次のように設定します。

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 に答える