‘ActionScript3’ カテゴリーのアーカイブ

FLV周辺の再利用やノイズ対策

2008 年 5 月 3 日 土曜日

たくさんのFLVをいかに効率よく、美しく流すか。
みたいなメモです。

- 前提
Video、NetStreamやNetConnectionなどの処理を
まとめたVideoSpriteクラス、みたいなものを作る。
これらのインスタンスを毎回消去して、新しくnewすると
ブラウザに負荷がかかるので、消去せずに再利用する。

- 再利用と消去
以下に載せたクラスで、再利用前にやるのがsleepメソッド。
本当にいらなくなった時に消去するために呼ぶのがkillメソッド。

- ノイズ防止
FLVはキーフレーム間を差分で描画しているので、無茶な処理をすると
ピンクのノイズが出て、描画がボロボロになります。その対策。

1. 一度playを実行した_ns(NetStream)に再度playをかける時は、
必ずthis._ns.close();を呼んでから。

2. 再生中のものを頭出ししてすぐ再生したい時は
pause(); → seek(0); → NetStatusEventのNetStream.Seek.Notifyを受ける。
→ resume();
(単純に1のように、closeして再度playでもいい気がします)

– 追記(08/05/20):
再生中のものはすでにキャッシュ済みなのですぐ再生可能
→ 単純に1のように、closeして再度playした方が良いです。
—-

まとめると、closeし忘れに注意ということです。

以下 as。

package{

	import flash.display.Sprite;
	import flash.events.NetStatusEvent;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;

	public class VideoSprite extends Sprite

		private var _video:Video;
		private var _nc:NetConnection;
		private var _ns:NetStream;

		public function VideoSprite():void{
			this._video = new Video();
			this.addChild(this._video);
			//NetConnectionをnew
			this._nc = new NetConnection();
			this._nc.connect(null);
			//NetStreamをnew
			this._ns = new NetStream(this._nc);
			var customClient = new Object();
			this._ns.client = customClient;
			//NetStreamをattach
			this._video.attachNetStream(this._ns);
			//イベント定義
			this._ns.addEventListener(NetStatusEvent.NET_STATUS, this.statusHandler);
		}

		//NetStatusEvent処理
		private function statusHandler(event:NetStatusEvent):void
		{
			switch(event.info.code) {
				// 省略
				default:
					break;
			}
		}

		//色々省略

		//再利用時のクローズ作業
		public function sleep():void{
			this._video.clear();
			this._nc.close();
			this._ns.close();
		}

		//消去時
		public function kill():void {
			this.sleep();
			this.removeChild(this._video);
			this._ns.removeEventListener(NetStatusEvent.NET_STATUS, this.statusHandler);
			this._video.attachNetStream(null);
			this._ns = null;
			this._nc = null;
			this._customClient = null;
			this._video = null;
		}
	}

}

参照の値渡し

2008 年 2 月 16 日 土曜日

「参照の値渡し」ということばを初めて聞いた。

まず基本から。プリミティブ型とオブジェクト型の違い。

/* ActionScript3 */
//テスト1
var strA:String = "AAA";
var strB:String = "BBB";
this.strA = this.strB; //BBB, BBB
this.strB = "CCC"; //BBB, CCC
this.strA = "DDD"; //DDD, CCC

//テスト2
var objA:Object = {value: "AAA"}
var objB:Object = {value: "BBB"}
this.objA = this.objB; //BBB, BBB
this.objB.value = "CCC"; //CCC, CCC
this.objA.value = "DDD"; //DDD, DDD

//テスト3
var objA:Object = {value: "AAA"}
var objB:Object = {value: "BBB"}
this.objA = this.objB; //BBB, BBB
this.objB = {value: "CCC"} //BBB, CCC
this.objA = {value: "DDD"} //DDD, CCC

次に実は今まで少し不安だった部分の検証。
引数として受ける時、どんな感じに参照されているか。
これが参照の値渡しってことなのかも。

/* ActionScript3 */
//テスト1
var strA:String = "AAA";
var strB:String = "BBB";
this.strA = this.strB; //BBB, BBB
this.setCCC(this.strB); //BBB, BBB
this.setDDD(this.strA); //BBB, BBB

function setCCC(str:String):void{
str = "CCC";
}
function setDDD(str:String):void{
str = "DDD";
}

//テスト2
var objA:Object = {value: "AAA"}
var objB:Object = {value: "BBB"}
this.objA = this.objB; //BBB, BBB
this.setCCC(this.objB); //CCC, CCC
this.setDDD(this.objA); //DDD, DDD

function setCCC(obj:Object):void{
obj.value = "CCC";
}
function setDDD(obj:Object):void{
obj.value = "DDD";
}

//テスト3
var objA:Object = {value: "AAA"}
var objB:Object = {value: "BBB"}
this.objA = this.objB; //BBB, BBB
this.setCCC(this.objB); //BBB, BBB
this.setDDD(this.objA); //BBB, BBB

function setCCC(obj:Object):void{
obj = {value:"CCC"};
}
function setDDD(obj:Object):void{
obj = {value:"DDD"};
}

たぶん当たり前のことなんだけど、
どこからどこまでが同じメモリの参照なのか
ということがわかりました。

- 参考サイト
AS3では関数の引数はすべて値渡し(call by value)である / flashrod
参照渡し・値渡し - PBD - subtech
func09 » コリン・ムック「今から始めるActionScript 3.0」に行ってきました

Singleton

2008 年 2 月 7 日 木曜日
/* ActionScript3 */
package{

public class Singleton{

//自身のインスタンス
private static var _instance:Singleton;

//コンストラクタ
public function Singleton(pvt:SingletonEnforcer){
this.init();
}

//インスタンスのgetter
public static function get instance():Singleton{
if ( Singleton._instance === null ) {
Singleton._instance = new Singeleton(new SingletonEnforcer());
}
return Singleton._instance;
}

//インスタンスの初期化
private function init():void{}
}
}
}

internal class SingletonEnforcer{}

- 参考URL
AS3 で Singleton - PBD - subtech
pixelbreaker : AS3.0 Better Singletons

TypeError: Error #1085

2008 年 1 月 31 日 木曜日

AS3でURLLoaderからXMLを読み込み後、
this._myXML = XML(this._myLoader.data);
って感じにXMLに代入するとき、

IE6で
「TypeError: Error #1085: エレメント型 “link” は対応する終了タグ “” で終了する必要があります。」
というエラーが出て困った。

原因は、hetemlの404ページの変なhtmlを
読み込んでしまっていたことだった。おそらく。
(Firefoxではスルーだった。)

htmlとswfを別の階層に置いていたので、
ローカルでパブリッシュ時は一発OK。
htmlにswfが乗っかって再生時は、一度ロードかけてエラーが出た後に
パスにswfのディレクトリを足してリロード。と思っていたが、
今後こんなことで悩みたくないので、htmlとswfは同じ階層に置こう。

Error Messages

2008 年 1 月 31 日 木曜日

Flash CS3のエラーメッセージ。
日本語版使ってれば日本語で出るけど、
これって英語だとなんて言うエラーだろう
という時のために書き出した。

1093
A class name was expected.
クラス名が必要です。

1094
A base class name is expected after the ‘extends’ keyword.
基本クラス名が、’extends’ キーワードの後に必要です。

1095
A member attribute was used incorrectly.
メンバー属性が正しく使用されていません。

1096
The same member name may not be repeated more than once.
同じメンバー名を繰り返し使用することはできません。

1097
All member functions need to have names.
すべてのメンバー機能には名前が必要です。

1099
This statement is not permitted in a class definition.
このステートメントは、クラス定義で許可されていません。

1100
A class or interface has already been defined with this name.
クラスまたはインターフェイスが既にこの名前で定義されています。

(more…)