Entries of flash

Flashでサウンドスペクトラムまとめ

Flashでサウンドスペクトラムまとめ

Flash9(というかAS3)では、音声のスペクトラム情報が取得できるわけですが、Flash9が発売される前に、ほぼ実験でしまくられた感じ。
多分、このあたりは音楽系サイトで超大流行するんだろうなぁ。

下品にならないように使うのムズかしそうだなぁ。

AS3メモ 毎フレーム3000本ほどラインを引きたい

ちょっとAS3で実験サンプル作ってて、毎フレームラインを3000本ほど引きたいのだけど、普通にやるととっても重い。
どうすりゃいいんだろ。

以下、800*600のフィールドにランダムなライン3000本を引いた結果

・直線を格納したMCを3000個配置する。(ほぼハング)
・1つのMCにmoveTo, lineToで3000本直線を書く。 (5-10秒かかる戦力外)
・1枚のBitmapにsetPixelで無理やり書く。(0.4 – 2秒、以外にもそこそこ速い)
・1枚のBitmapにByteArrayで無理やり書く(0.4 – 2秒、こころもちsetPixelより速い)。

うーん、4番かなぁ。
これちゃんと検証するのメンドイなぁ。

とりあえず、表示するクラスをMovieClipとSpriteとShapeとかえるだけで、速度が侮れないほど違う。

Flash超絶検索


新サービスYahoo! Search Builderを使って、国内のFlashテクニカルネタを網羅する検索エンジン作ってみた。

情報管理の面でFlash馬鹿ブックマークとどっちが便利なのかな。現状、fladdictのブックマークに検索ワードいれば9割方欲しい情報は手に入るのだけど、なんか併用できないかな。マッシュアップしにくそうなんだよな、この検索エンジン。

AS3メモ ガベッジコレクションについて

どうやら、色々な偉い人の話をまとめると、ガベージコレクションの仕組みを知らずにAS3でコードを組むと、ハングアップの危険がいっぱいということみたい。

とりあえず理解しなければならないのは delete の新しい挙動と、リファレンス・カウント、マーク&スイープという概念らしい。

AS3 メモ

結論から言うと、現状はFlash9とAS3でフルスクラッチでスクリプトベースのサイトを作るのはかなり無謀。
processingでサイト丸ごと作るのと同じくらい無謀。

おそらくAS3は、いかにコード神がお書きになったコンポーネントやフレームワークを使いこなして、自分で難しい処理をかかないようにするか。自分がやるのは、データの結合、アニメ指定、ページ遷移だけにする、というのがキーになりそうな悪寒。

自分でボタンやプルダウンとか作るのは危険な香り。

mxコンポーネントを却下して、自分で表現系に強いコンポーネントを作るより、その暇を全て注入して既存のコンポーネントで、従来のFlash並みの表現を可能とするなアニメーションライブラリを作る方向でいくのがよいんじゃないかと。MC作ったり消したりしてると、ちょっと油断するだけでnull poiner exceptionでまくり。

逆に、AS3は神が創ったライブラリの使い方さえ覚えれば、自分であまり特別なことができなくても、ガンガン高度な処理を行えそう。なんで、今後のAS3勉強は下記みたいな感じでいこうかと。

サイト製作 → 神がコンポーネントを完成させるまで保留
Util系クラス → ガンガン作り貯める
mx.effects.easingライブラリ → ガンガン作り貯める
物理・数学・フィルター・ビットマップ操作 → ガンガン作り貯める
コンポーネント系 → 神頼み (手を出すと後で死ぬと思われ)
パーサ、アナライザー、その他専門知識が必要系 → 神頼み

R.Pennerとか G Skinnerとか頑張れ。

AS3メモ Flex2のmxパッケージをFlash9で使用する

なんかできるらしい。

1.無料のFlex2 SDKをダウンロードして展開する。
2.使用したいクラスのソースコードを開き
 1.コード内にある”mx.core.mx_internal”等の、flex2に直結したクラスのインクルードをコメントアウトする
 2. コード内にある全ての”mx_internal”というネームスペースの記述を取り除く
2.Flash9のクラスパスにFlex2 SDKのmxクラスディレクトリを追加する。

これで、Flex2の強力なバリデーションや、アニメーションクラスがFlash9で使えるとか。
未検証な情報ですが、一応。

AS3用 トゥイーン・クラスのメモ

AS3(flex2)のアニメーションは、ロバート・パンナーのtweenライブラリが採用されてるすね。
ってことは、Flash9がリリースされたときには、スクリプトのアニメーションはflex2同様に、mx.effects.easing ライブラリで制御されるっぽい。

自作でイージイン用のコード書く場合も、これと入出力を同じにしとくとあとで交換がきくんジャマイカと。

function( 現在の時間, 初期値, 増減差分, アニメーション時間): Number{
~ ここで計算 ~
return resultValue
}

とすると、基本のアニメーション関数はこんな感じかな

Sineによる可減速

function( currentTime, initValue, difference, duration): Number{
var rad = currentTime / duration -0.5 ;
var resultValue = (Math.sin(  rad *Math.PI  ) +1) * 0.5 * difference + initValue
return resultValue
}

ってやったら、あまり気持ちよくない・・・ どうやらSinじゃなくてQuadricのトゥイーンを実装しなきゃダメっぽいけど
数学わかんね・・・

と思ったら、R.Penner easingの掲示板への書き込みを発見。この式を移植しろってことなのかな。

イーズアウト
currentValue = -difference * (currentTime/=duration)*(currentTime-2) + initValue;

イーズイン
currentValue = difference*currentTme*currentTime/(duration*duration) + initvalue;

イーズイン&アウト

将来的なことを考えるのなら、Flash使いにとって定番だった、x = x + ( tx – x ) * speed の式をそろそろ卒業せにゃあかんということなのかなぁ・・・ 数学メンド臭いなぁ。

これとかも資料

AS3用のCommandライブラリ作ってみた

net.fladdict.commands パッケージ

「任意の関数を実行する」という機能を実装したAS3用のCommandライブラリを作りました。
AS3でのボタンのカスタマイズや、アニメーション、動的な動作変更のたたき台になるんじゃないかと。とりあえず版権フリーです、というか誰かもっと使いやすくして再アップして…
たたき台なのでまだ色々とアレです。

一応、内包してるクラスは以下の通り

Command
関数executeから、登録した任意の関数を実行する。

TimerCommand
関数execute実行後、指定時間たったタイミングで登録した任意の関数を実行する。

EnterFrameCommand
関数execute実行後、指定フレームたったタイミングで任意の関数を実行する。

MacroCommand
関数executeから、登録した複数のCommandサブクラスを一括実行する。

SequenceCommand
関数executeから、登録した複数のCommandサブクラスを一括実行する。MacroCommandが全てのコマンドを一斉に実行するのに対し、こちらは1つ1つ処理が終わる毎に次のCommandを実行する。ファイルロードやアニメーションなど非同期通信向け。

CommandEvent
コマンドの完了時に発行されるcommandCompleteイベントと、複数の関数を実行する場合に1つづつ呼ばれるcommandProgressの2種類。

AS3メモ Commandライブラリ仕様メモ

FlashOOPのクラス共有プロジェクト用に、Commandクラスライブラリを作ろうかと模索中。

というか仕事でもプライベートでも、自動化したい処理がやたらいっぱいあって、AS2でもAS3でも両方必要な気分になってきた。
作る前に考えまとめたいので、メモ。

Applyをラップして、任意のタイミングで任意の関数を呼び出すクラスを実装するとして、結城先生の本をベースにEventDispatcherを追加するとこんな感じかな??

public class Command implements ICommand extends EventDispatcher{
private var _thisObj:Object;
private var _functionRef:Function
private var _arguments:Array

public function Command( _thisObj:Object, _functionRef:Function, _arguments:Array):void{
this._thisObj = _thisObj;
this._functionRef = _functionRef;
this._arguments = _arguments;
}

public function execute( ... args:Array ):Object{
var rslt:Object = _functionRef.apply( _thisObj, args || _arguments);
var event:CommandEvent = new CommandEvent( CommandEvent.COMPLETE)
event.result = rslt;
dispachEvent( event );
return rslt;
}
}

基本的に、コンストラクタで関数の引数を定義するのだけど、executeから関数を呼び出すタイミングでも引数を渡せる。で、関数の実行結果を戻してくれる。 AS3からクロージャが自動でデリゲートされるらしいけど、AS2とロジックをできるだけ共有したいのでapplyで逝きます。

AS3メモ ローカル変数の宣言って微妙に重いのか?

やりたいことの処理が、AS3の処理速度でも微妙におっつかない orz。
で、色々実験中。

ちゃんと検証してないからなんともいえないのだけど、ひょっとして厳格なローカル変数の宣言ってそれなりに負荷高かったりするんすかね?

2万回ぐらいのループがあるときに、ループ内で使用する変数をループ外で宣言するようにしたら、心持かなり高速化された気がするんですけど気のせいなのかな。

var hoge:Number
var hogehoge:Number
...
for(var i:Number=0; i<20000; i++){
}

今の御時勢変数が2~3万個ぐらい増えてもメモリー的になんの影響もないなら、ローカルで計算に使う変数とか全部プロパティ化して最初から定義しておいたほうが速かったりするのかね。

そこら辺詳しい人、誰かおしえてくだつぁい。