トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     「ムービー内のスクリプトが原因でMacromedia Flash Player 7 の実行速度が遅く・・・」Msgについて
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
tiffin
Åê¹ÆNo.2753
投稿日時: 2004-1-8 10:00
新米
居住地: 神奈川
投稿: 13
使用環境:
7.0.1Win2k-Pro(SP4)
「ムービー内のスクリプトが原因でMacromedia Flash Player 7 の実行速度が遅く・・・」Msgについて
Actionscriptにおいて多くの処理を一度に行うと、Flashムービーを鑑賞する際に、
以下の内容のエラーメッセージが表示されます。

 「ムービー内のスクリプトが原因でMacromedia Flash Player 7 の実行速度が遅くなっています。
 このまま継続すると、応答しなくなることがあります。スクリプトの実行を中止しますか?」

エラーメッセージの表示を回避する方法として、
マクロメディアのFlash TechNoteには、「複数のフレームをまたいでループするようなムービーを作成する必要があります。」
との説明があります。http://www.macromedia.com/jp/support/flash/ts/documents/fl0251.html

複数のフレームをまたぐ以外に、エラーメッセージの表示を回避する方法はありませんか?

よろしくお願いします。
森 巧尚
Åê¹ÆNo.2755
投稿日時: 2004-1-8 10:48
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: 「ムービー内のスクリプトが原因でMacromedia Flash Player 7 の実行速度が遅く・・・」Msgについて
引用:

tiffinさんは書きました:
複数のフレームをまたぐ以外に、エラーメッセージの表示を回避する方法はありませんか?

「Flashムービー」と言われているように、Flashは基本的にムービーで、Actionscriptはそのムービーを補助するスクリプトでしかありません。
ですから、Flash上でムービーの進行に支障をきたすほどの多くの処理を1フレーム内で行うとこのエラーメッセージが出るわけですね。
1つのフレームアクションで、多くのループ処理などを一気に行ったりすると、処理が独占されてムービーの再生処理に影響が出ますから、やはりフレームを一回抜けるような構造にしたほうがいいと思います。

イベント駆動型のソフトウェア開発でも1つのイベント処理で多くの処理を一度に行ってしまうと反応が遅くなってよくありませんが、あれと同じです。処理の途中で一回解放してイベント処理に戻してやる設計と同じですね。


----------------
森 巧尚
http://www.ymori.com

tiffin
Åê¹ÆNo.2762
投稿日時: 2004-1-8 15:54
新米
居住地: 神奈川
投稿: 13
使用環境:
7.0.1Win2k-Pro(SP4)
Re: 「ムービー内のスクリプトが原因でMacromedia Flash Player 7 の実行速度が遅く・・・」Msgについて
引用:
イベント駆動型のソフトウェア開発でも1つのイベント処理で多くの処理を一度に行ってしまうと反応が遅くなってよくありませんが、あれと同じです。
処理の途中で一回解放してイベント処理に戻してやる設計と同じですね。


回答有難うございます。

なるほど!VisualBasicでやるDoEventsと同じですね。

ActionScriptではどのようにやればよいのでしょうか?
調べたのですが、残念ながら方法がわかりませんでした・・・

もし、ご存知でしたら教えてください。
加藤達雄
Åê¹ÆNo.2780
投稿日時: 2004-1-9 1:43
新米
居住地: 東京
投稿: 24
使用環境:
Win XP Pro
MX Pro 2004
Re: 「ムービー内のスクリプトが原因でMacromedia Flash Player 7 の実行速度が遅く・・・」Msgについて
引用:

tiffinさんは書きました:
複数のフレームをまたぐ以外に、エラーメッセージの表示を回避する方法はありませんか?


onEnterFrameを使用するのはどうですか?
例えば、

for (var i = 0; i < 20000; i++) {
	trace(i);
}

といった大きなループを実行したい場合に、

for (var i = 0; i<20; i++) {
	for (var j = 0; j<1000; j++) {
		trace(1000*i + j);
	}
}

とネストしたループに置き換え、内側のループひとまわしを
ひとフレームで行うサンプルが以下になります。

function bigLoop(func, iMin, iMax, jMin, jMax) {
	this.i = iMin;
	for (var j = jMin; j<=jMax; j++) {
		func(this.i, j);
	}
	if (this.i<iMax) {
		this.i++;
		this.onEnterFrame = function() {
			bigLoop(func, this.i, iMax, jMin, jMax);
		};
	} else {
		delete this.onEnterFrame;
		delete this.i;
	}
}

bigLoop( function (i, j) {trace(1000*i + j);}, 
			 0, 19, 0, 999 );
tiffin
Åê¹ÆNo.2847
投稿日時: 2004-1-13 12:49
新米
居住地: 神奈川
投稿: 13
使用環境:
7.0.1Win2k-Pro(SP4)
Re: 「ムービー内のスクリプトが原因でMacromedia Flash Player 7 の実行速度が遅く・・・」Msgについて
引用:
TatsuoKato さんは書きました:

onEnterFrameを使用するのはどうですか?


TatsuoKatoさん、返信ありがとうございます!

試してみたところ、確かにエラーメッセージが表示されなくなりました。(感謝)


ですが、ループの回数を条件によって変える予定なので、この方法では厳しいかもしれません。

欲張りなようで申し訳ないのですが、簡単にできる方法はないのでしょうか???
youich
Åê¹ÆNo.2854
投稿日時: 2004-1-13 15:54
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: 「ムービー内のスクリプトが原因でMacromedia Flash Player 7 の実行速度が遅く・・・」Msgについて
kaotさん、こんにちは。
tiffinさんのflash7.03ということはMX2004ですね。
で直接質問には関係ないんですけど、2004でのスクリプティングで
従来のASとの妥協、折衷(ちょっと変ですね)のラインは↓のcmd,cmd2
あたりのやり方かな、と思うんですがどう思います?
(昼飯時に書いたので内容のつっこみは無しでおねがい?)

interface LoopCommand{
    function doLoopFunc(count:Number);
    function loopFinished();
}
interface BigLoop{
    function doLoop(maxi:Number);
}

class SetIntervalLoop implements BigLoop {
    var _cmd:LoopCommand;
    var looplimit:Number = 1000;
    var maxi:Number = 0;
    var nowLoop:Number = 0;
    var loopid:Number;
    function SetIntervalLoop(cmd:LoopCommand) {
        _cmd = cmd;
    }
    function doLoop(n:Number) {
        maxi = n;
        nowLoop = 0;
        loopid = setInterval(this, "_doLoop", 0);
    }
    function _doLoop() {
        var n:Number = 0;
        while (n++<looplimit) {
            if (nowLoop>=maxi) {
                clearInterval(loopid);
                _cmd.loopFinished();
                break;
            }
            _cmd.doLoopFunc(nowLoop);
            nowLoop++;
        }
    }
}
class OnEnterFrameLoop extends MovieClip implements BigLoop{
    function doLoop(maxi:Number){
    //
    }
}



class CommandA implements LoopCommand{
    function doLoopFunc(count:Number){
        trace('CommandA: '+ String(count));
    }
    function loopFinished(){
        trace('CommandA finished');
    }
}
class CommandB implements LoopCommand{
    var sum:Number = 0;
    function doLoopFunc(n:Number){
        sum += n;
    }
    function loopFinished(){
        trace("CommandB Finished: "+String(sum);
    }
}        
class AdaptCommand implements LoopCommand{
    var _obj:Object;
    function AdaptCommand(obj:Object){
        _obj=obj;
    }
    function doLoopFunc(n:Number){
        _obj.doLoopFunc(n);
    }
    function loopFinished(){
        _obj.loopFinished();
    }
}    

class DefaultCommand implements LoopCommand{
    function doLoopFunc(n:Number){}
    function  loopFinished(){}
}

//-- Frame -- //
//var cmd:LoopCommand = new CommandA();
var obj:Object = new Object();
obj.sum = 0;
obj.doLoopFunc = function(n){
    this.sum += n;
}
obj.loopFinished = function(){
    trace('obj finishied:' + String(this.sum));
}

var cmd:LoopCommand = new AdaptCommand(obj);
var bl:BigLoop = new SetIntervalLoop(cmd);
bl.doLoop(100);

//var cmd:LoopCommand = new CommandB();
var cmd2:LoopCommand = new DefaultCommand();
cmd2.doLoopFunc = function(n:Number){
    trace("cmd2: "+String(n));
}
cmd2.loopFinished = function(){
    trace("cmd2 finished");
}
//var bl2:BigLoop = new OnEnterFrameLoop(cmd2);
var bl2:BigLoop = new SetIntervalLoop(cmd2);
bl2.doLoop(100);


----------------
- yo

加藤達雄
Åê¹ÆNo.2858
投稿日時: 2004-1-13 19:43
新米
居住地: 東京
投稿: 24
使用環境:
Win XP Pro
MX Pro 2004
Re: 「ムービー内のスクリプトが原因でMacromedia Flash Player 7 の実行速度が遅く・・・」Msgについて
まず、youichさんのアイデアをいただき、callbackを一応追加してみました。
function bigLoop(iMin, iMax, jMin, jMax, toDo, callback) {
	for (var j = jMin; j <= jMax; j++) {
		toDo(iMin, j);
	}
	if (++iMin <= iMax) {
		this.onEnterFrame = function() {
			bigLoop(iMin, iMax, jMin, jMax, toDo, callback);
		};
	} else {
		delete this.onEnterFrame;
		callback();
	}
}

引用:

tiffinさんは書きました:
ですが、ループの回数を条件によって変える予定なので、この方法では厳しいかもしれません。

欲張りなようで申し訳ないのですが、簡単にできる方法はないのでしょうか???

回数は動的に指定できます。
(iMax - iMin + 1) フレームに渡り、ひとフレームあたり、
(jMax - jMin + 1) 回、実行することになります。

(youichさんのJavaライクなアプローチのほう、じっくり見させていただいてから返信します。)
加藤達雄
Åê¹ÆNo.2864
投稿日時: 2004-1-14 2:30
新米
居住地: 東京
投稿: 24
使用環境:
Win XP Pro
MX Pro 2004
Re: 「ムービー内のスクリプトが原因でMacromedia Flash Player 7 の実行速度が遅く・・・」Msgについて
引用:

youichさんは書きました:
2004でのスクリプティングで
従来のASとの妥協、折衷(ちょっと変ですね)のラインは↓のcmd,cmd2
あたりのやり方かな、と思うんですがどう思います?
(昼飯時に書いたので内容のつっこみは無しでおねがい?)

youichさん、こんばんは。
折衷案なんですが、個人的にはもう少しだけFlashならではのワザを取り入れても良いのかなという気はしますが、どんなもんでしょう。例えば、functionを渡せるとか、メソッドのオーバーロード無しに引数の組み合わせを変えられるといったあたりのメリットを生かして、こんな感じはどうなんでしょうか。
//BigLoop.as
class BigLoop {
	private var totalTimes:Number;
	private var frames:Number;
	private var timesPerFrame:Number;
	private var toDo:Function;
	private var callback:Function;
	private var count:Number = 0;
	private var mc:MovieClip;
	static var baseMC:MovieClip = _root.createEmptyMovieClip("BigLoopBaseMC", 200000);
	static var mcID:Number = 0;
	
	function BigLoop(totalTimes:Number, frames:Number, toDo:Function, callback:Function) {
		this.totalTimes = totalTimes;
		this.frames = frames;
		this.timesPerFrame = Math.floor(totalTimes/frames);
		
		this.toDo = toDo;
		this.callback = callback;
		
		this.mc = baseMC.createEmptyMovieClip("loopMC" + mcID, mcID);
	}
	function get Count() {
		return count;
	}
	function set ToDo(toDo:Function) {
		this.toDo = toDo;
	}
	function set Callback(callback:Function) {
		this.callback = callback;
	}
	
	function excute():Void {
		for (var j = 0; j < timesPerFrame; j++) {
			if (++count > totalTimes) {
				delete mc.onEnterFrame;
				callback();
				return;
			}
			toDo();
		}
		var obj = this;
		mc.onEnterFrame = function () {
			obj.excute();
		}
	}
}

//.fla
//トータル500回を10フレームかけて実行するloopオブジェクトの生成
var loop:BigLoop = new BigLoop(500, 10);
//500回実行する動作を指定
loop.ToDo = function () {
	trace(this.Count);
}
//コールバックの動作を指定
loop.Callback = function () {
	trace("done!");
}
//実行
loop.excute();

あくまでも単に好みとかスタイルの問題ではありますが。。。
tiffin
Åê¹ÆNo.2932
投稿日時: 2004-1-16 9:04
新米
居住地: 神奈川
投稿: 13
使用環境:
7.0.1Win2k-Pro(SP4)
Re: 「ムービー内のスクリプトが原因でMacromedia Flash Player 7 の実行速度が遅く・・・」Msgについて
youichさん、katoさん有難うございました!

参考にしたいと思います。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops