インタラクション・デザイン・グループから、Flashを使った表現や技術などを紹介
 
 
 
2011.10.14 個別ページ
 
 
sh
 

Adobe MAX 2011から「Deep Dive into Molehill (Stage 3D)」のセッションレポートです。
Prosceniumの話です。前半のStage 3Dの最適化の話は前のレポートをご覧ください。
例によって、あまりに専門的な部分は翻訳できていません。すみません。

Prosceniumとは
Proscenium(プロセニアム)は、ActionScriptを使って3D表現を簡単に行えるようにしたAdobe製の、いわば純正のフレームワークです。Adobe Labsで公開されています。プロセニアムというこの聞き慣れない単語は、劇場において、舞台の上と左右についているアーチ型の枠のことのようです。
Prosceniumは、一部Pixel Bender 3D(AS3)と連携して動作します。また、Adobeの製品を使ったワークフローとしては、Photoshop Extendedを使って3Dモデルを書き出し、Proscenium(Flash Player 11)で動かすということも実現可能なようです。

Scene Graph(シーングラフ)
Prosceniumの中のオブジェクトは、シーングラフという構造で管理されています。例えばStageの子として、城と馬があって、馬の子として騎士がいて、騎士の子として槍と盾があります。人の形をしたものの場合も同じで、それぞれのパーツが親子関係を持って管理されています。
シーンに配置するオブジェクトは、他の3Dモデリングソフトで作成したものを読み込んだり、Prosceniumの中で作ったりします。
シーンが用意できたあとは、ライト、カメラ、アクションです。

コードの断片をみながら、Prosceniumがどのように動いているか見てみましょう。

シーンの準備
Prosceniumの最小のプログラムは次のようなものになります。必要なことはすべてBasicSceneクラスに書かれています。

import com.adobe.scenegraph.*;

public class Demo extends BasicScene
{
}

シーンにライト、カメラ、オブジェクトを追加
ライト

override protected function initLights():void
{
    var light:SceneLight = new SceneLight();
    light.setPosition(3, 4, 5);
    scene.addChild(light);
}

カメラ

override protected function resetCamera():void
{
    scene.activeCamera.identity();
    scene.activeCamera.appendTranslation(0, 2, 10);
    scene.activeCamera.appendRotation(-15, Vector3D.X_AXIS);
}

オブジェクト

override protected function initModels():void
{
    scene.addChild(MeshUtils.createCube(2));
}

このように、わずか数行のコードでそれぞれを記述できます。

シーンにアニメーションを追加

public var cube:SceneMesh;

override protected function initModels():void
{
    cube = ProceduralGeometry.createCube(2);
    scene.addChild(cube);
}

override protected function onAnimate(t:Number, dt:Number):void
{
    cube = appendRotation(dt * 30, Vector3D.Z_AXIS);
    cube = appendRotation(dt * 50, Vector3D.Y_AXIS);
}

Prosceniumは、GPUを使って描画するので、大量のインスタンスを配置してもなめらかに動きます。

Model Loader(モデルローダー)
.OBJ
ASCIIファイルフォーマット。三角とポリゴンのメッシュの集合。
メッシュごとに複数のマテリアルを持てる。フォンマテリアルモデル。

COLLADA/KMZ
.DAEのXMLフォーマット。OBJフォーマットの情報に加えてライト・カメラ、オブジェクトの階層、スキン付きキャラクター、アニメーションのデータが加わる。

独自のバイナリフォーマット
.DAEの情報を持ちつつ、さらなる圧縮率と短いロード時間を実現します。

Mesh Processing(メッシュプロセッシング)
Mesh Processingを使えば、3000行もの行を書かなくてすみます。内部では次のようなことを行います。
・全メッシュデータを三角形のリストに変換する
・サーフェイスの法線とtangentを自動的に生成
・GPUでのキャッシュの一貫性を最大化するように三角形の順序を入れ替え
・ハードウェアの制約の中で残るようにメッシュを分割

Basic Scene : モデルの読み込み

import com.adobe.scenegraph.loaders.*;
import com.adobe.scenegraph.loaders.collara.*;
public var loader:ColladaLoader;

override protected function initModels():void
{
    loader = new ColladaLoader("model.dae");
    loader.addEventListener(Event.COMPLETE, onLoad);
}

public function onLoad(event:Event):void
{
    loader.model.addTo(scene);
}	

Basic Scene : 読み込んだモデルへのアニメーションの適用

public var animations:Vector.<AnimationController>, initialized:Boolean;

public function onLoad(event:Event):void
{
    loader.model.addTo(scene);
    animations = loader.model.animations;
    for each(var anim:AnimationController in animations)
        anim.bind(scene);
    initialized = true;
}

override protected function onAnimate(t:Number, dt:Number):void
{
    if(!initialized)
        return;
    for each(var anim:AnimationController in animations)
        anim.time = (t % anim.length) + anim.start;
}	

画像フォーマット
TARGA
TGAファイル。アルファチャネルをサポート。ランレングス圧縮(RLE)

TIFF
TIFFファイル。LZW、ZIP圧縮。チャンネルごとの高いビット深度の可能性を持っている。

マテリアル
マテリアルはオブジェクトのサーフェス(表面)の見た目を定義する。
読み込んだモデルは、それらのマテリアルもそのまま持ってくる。
マテリアルやアトリビュートの作成、変更のためのAPIが用意されている。
AGALやPixel Bender 3Dで書いたシェーダーを使って、基本のマテリアルクラスを拡張できる。

Basic Scene: マテリアル

override protected function initModels():void
{
    var material:MaterialStandard = new MaterialStandard();
    material.diffuseColor.set(1, .9, .3);
    cube = MeshUtils.createCube(2, material);
    scene.addChild(cube);
}

マテリアルの色、マッピング、値の設定
Diffuse, Specular, Opacity, Bump, Emissive, Ambient, Environment, Normal

ライトの設定
・Distant, Point, Spotの3種類
・Shaders express material properties as well as geometry deformations
・Skinned Animations, Morphs

テクスチャマップとライトの種類の組み合わせごとに、AGALのvertexおよびfragmentシェーダーが必要。爆発的に増加する。

Standard Material Shader Factory
・MaterialStandardShaderFactoryは、マテリアル、メッシュ、ライトのプロパティのセット
・自動的に適切なvertexおよびfragmentのAGALプログラムを生成する
・組み合わせの数を減らすために、ライトのタイプや頂点のアトリビュートなどのようなプロパティを統合

Render Graph
・高度なレンダリング機能(Bitmapped shadows、Reflections、Billboards、In-scene video screens)
・Automatically generates a dependency graph
・Orders and consolidates rendering targets using strong component analysis of the graph
・Indentified cycles in the graph and resolves them by using prior frames as content

大気エフェクト

ビルトインのpoint, spot, distantライトのshadow

透過
order-independentな透過、FSAA互換、Casts transparent shadows

Post Processing Effects
PixelBender3Dフィルタを使って実現。Render graphによって簡単にマルチパスエフェクトを実現。Bloom filter。自分で拡張可能。

パーティクルシステム
GPU-based
vertex shaderを使用。Procedural motion in shader。パーティクルごとに状態は保持できない。雪、銀河、花火などを表現。30万パーティクル。

CPU-based
ActionScriptを使う。モーションには複雑な機能を持たせられる。パーティクルごとに状態を保持できる。5000パーティクル。

Rigid Body Dynamics(物理エンジン)
ActionScript「Pallet」エンジン
Bullet Engineのサブセット。剛体力学と衝突、ボックスとカプセル、地形、任意の固定メッシュをサポート。

2Dの流体
PixelBender 2Dを使用


Stage 3Dはすごい。でもAdobeが用意したのは低レベルのAPIだけでした。一体どうやって普通のFlashエンジニアが使うのだろうと筆者は思っていました。
サードパーティ製のフレームワークを使うしかないのか、と思っていたところに発表されたのが、Prosceniumです。Adobe純正ならではの安心感のようなものがありますね。5人くらいのチームで開発したそうです。
次のFlash Proには、簡単な3Dオブジェクトを配置したり、テクスチャを貼ったりする機能がつくのでしょうか。

Prosceniumは、単に3Dフレームワークだけでなく、ゲームやインタラクションを作る場合に不可欠なパーティクル、物理エンジンまで付けてきました。思っていたよりも使えるフレームワークのようです。
Alternativa3DやAway3Dなどと比較しながら勉強してみるのもおもしろいかもしれません。

それにしても、Flashエンジニアは一体どこまで勉強したらよいのでしょうね。大変な時代になってきました。

 
 
 
2011.10.12 個別ページ
 
 
sh
 

Adobe MAX 2011から「Deep Dive into Molehill (Stage 3D)」のセッションレポートです。このセッションは前半がStage 3Dの最適化の話、後半がProsceniumの話でした。Proscenium編は次回のレポートをご覧ください。

理解が及ばす、翻訳できていないことが多く、すみません。

■Molehill
Molehill(モルヒル)は、昨年Stage 3Dが発表されたときのコードネームですが、もぐらのことです。もぐらは、そこにあるものが食べられるかどうかを、わずか8ミリ秒(神経細胞の限界速度)で判断するそうです。速い!

■まずアルゴリズムを最適化しよう
・アルゴリズムをGPUフレンドリーに
・描画の呼び出しは最小限に
 早めに効率的に。メッシュやテクスチャデータはマージしたものを使う。
・バッファのアロケーションとアップロードは最小限に
・動的でないものは前もって計算して持っておく
・圧縮されたテクスチャを使う
・余分なAPIコールを避ける(but don't sweat it)

■アルゴリズム最適化の例
パーティクルシステム
・パーティクルを1つ1つ描くのはやめる
・1回のみの描画の呼び出しで、大きな頂点バッファを更新する
・vertex programではMathを使う
・Interpolated double vertex buffer, with sparse updates

■プログラムの最適化
・プログラムは短く。特に内側のループ
・vertex programは、fragment programよりずっと低コスト
・リリース時には、使っていないdummy streams aroundを消そう

mov vt0, va0
mov vt1, va1
m44 op, va0, vc0

・可能ならKIL instructionを避ける
・独立したtexture fetchを避ける

add ft0, v0, fc0
tex ft1, ft0, fs0 <2d>

・vertex programのindirect adddressingは避ける
・正しいtexture filteringを使う(linear, mipnearest)

■共有のトラップ(Common Traps)
・enableErrorChecking = false
・Flash Builderでは、リリースビルドでエクスポートする
・必要なくなったものはリソースをdisposeする
・不必要な2Dの再描画を避ける
・EnterFrameでRenderを行う
・フレームレートは20, 30, 60のどれかにする
・readbackはしない(drawToBitmapData)

■Threaded Rendering
Render Threadでは、Validateに失敗すると無視される

■Compressed Textures
・ATF(Adobe Texture Format)は、DXT1, PVRTC, ETC1を含みます。
・JPEG-XR、LZMAでパックされて転送されます。
・Adobe toolingはまだありません
・アルファチャンネルはありません

 
 
 
2011.10.06 個別ページ
 
 
sh
 

Adobe MAX 2011から「Developing 2D Games on top of Stage 3D」のセッションレポートです。

Stage3Dという名前のせいか、Flash Player 11で搭載されたこの新機能は、3D描画のためのものだと思うかもしれませんが、実は2Dの描画も大変高速になりました。高速になったおかげで、これまで諦めていたいろいろな表現が可能になっています。
3Dの世界を作り込むには、新しい知識をいろいろと身につけなければいけませんが、2Dなら今までの知識の延長で簡単に作れますので、ぜひ挑戦してみてください。
(ソースコードはアドビのガイドラインに沿った書き方ではない部分がありますが、原文のまま掲載します)

これまでの2D描画
これまで、2Dの描画を高速化する手法としては、
・Pixel Blitting(大きなビットマップを用意して、必要な画像をBitmapData.copyPixels()でコピーする手法
・GPUによるベクター描画(renderModeにGPUを指定、AIRのみ)
がありました。解像度は大きくなるばかりなので、CPUを使ってピクセルをスクリーンにプッシュするという方法に未来はありません。

これからの2D描画
Flash Player 11/AIR 3の登場により、Stage3Dを利用できるようになりました。
Stage 3D APIは、低レベルで(コンピューターにより近い位置で)、GPUを使って描画をするAPIです。従来のDisplay Listの下のレイヤーに描画されます。Stage 3Dは、コンピューターに非常に近いAPIなので、単純な矩形を描くだけでもかなり複雑なコードを書く必要があります。
そこで、フレームワークの登場です。面倒な処理は全部フレームワークにまかせて、僕らは表現のところだけ頑張りましょう。

Starling(スターリング)
ここではStarlingというフレームワークを紹介します。(Starlingはたぶんムクドリのことだと思います。)
Starlingは、これまで使ってきたDisplay Listのアーキテクチャに似たフレームワークです。これまでのSpriteの代わりに、StarlingのSpriteを使えばよいという感覚で大丈夫です。
GPUの上に、OpenGL/ES2、DirectXが乗っており、その上にStage3Dがあり、その上でStarlingは動いています。Starlingはコンパクトです。swfの容量は80KBしか増えません。
基調講演でも紹介された「Angry Birds HD」はStarlingを使っているそうです。驚くほどなめらかに動いていました。さりげなく背景に凝ったりもしていて、描画に余裕があることがわかります。
またStarlingを学ぶことで、GPUがどう働いているか理解を深めていくことができます。
StarlingはFreeBSDライセンスです。アドビもこのフレームワークの使用を推奨しています。

どんなコード?
var texture:Texture = Texture.fromBitmap(new embeddedBitmap());
var image:Image = new Image(texture);
quad.pivotX = 50;
quad.pivotY = 50;
quad.x = 300;
quad.y = 150;
quad.rotation = Math.PI/4;
addChild(quad);
細かいところは分からなくても、ああ、結局addChildすればいいのねと、なんとなく読めちゃうのではないかと思います。これがStarlingのよいところです。

表示オブジェクト
使い慣れたものと同じように、StarlingにもDisplayObject、DisplayObjectContainerがあります。また、Button、Sprite、Stage、TextField、Image、MovieClipという表示オブジェクト関連のクラスがあります。これに、Starling独特のQuadというクラスが追加されています。

イベント
Event.ADDED, Event.ADDED_TO_STAGE, Event.REMOVED, Event.REMOVED_FROM_STAGE, Event.TRIGGERED, Event.MOVIE_COMPLETED, Event.FLATTEN, Event.RESIZE, Event.ENTER_FRAME,
ResizeEvent.RESIZE, TouchEvent.TOUCH, KeyboardEvent.KEY_UPとKEY_DOWNがあります。
注意点としては、Timerは使わず、必ずEnterFrameEvent.ENTER_FRAMEを使ってください。

最小のコード
最小のコードはこんな感じです。

package
{
    import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import starling.core.Starling;
	
	[SWF(width="1280", height="752", frameRate="60", backgroundColor="#002143")]
	public class Startup extends Sprite
	{
	    private var mStarling:Starling;
		
		public function Startup()
		{
		     stage.align = StageAlign.TOP_LEFT;
			 stage.scaleMode = StageScaleMode.NO_SCALE;
			 
			 mStarling = new Starling(Game, stage);
			 mStarling.antiAliasing = 1;
			 mStarling.start();
		}
	 }
}

チェックする点
パフォーマンスを最高にするには、
・アンチエイリアスの品質設定
・エラーチェックを無効にしているか
・リリースビルドで書き出ししているか
をチェックしてください。

Quad(クアッド)
Quadは、テクスチャなしの、色だけの頂点からなる矩形のことです。色の補間はGPUで行われます。

q = new Quad(200, 200);
q.setVertexColor(0, 0x000000);
q.setVertexColor(1, 0xAA0000);
q.setVertexColor(2, 0x00FF00);
q.setVertexColor(3, 0x0000FF);
addChild(q);

単色の場合は、
q.color = 0x00FF00;
とします。

Image(イメージ)
Imageは、テクスチャありのQuadです。「テクスチャ」はビットマップ画像と同じ意味と思ってください。テクスチャは必要になる前に、あらかじめ用意しておくと良いでしょう。圧縮されたテクスチャが使えます。

var sausageBitmap:Bitmap = new Sausage();
var texture:Texture = Texture.fromBitmap(sausage);
var image:Image = new Image(texture);
addChild(image);

色合いは次のように指定します。
image.color = 0xFF0000;

Texture.fromBitmap()は最初に1回だけ行うようにして、for文の中で毎回やらないように気をつけてください。

Dynamic Texture(ダイナミックテクスチャ)
実行時に描いたシェイプをテクスチャとして使う方法です。shape.graphicsのソフトウェアラスタライザを使い、GPUにアップロードする仕組みです。これも、上で説明したように、前もってやっておきましょう。

var buffer:BitmapData = new BitmapData(radius * 2, radius * 2, true, color);
buffer.draw(shape);
var texture:Texture = Texture.fromBitmapData(buffer);
var image:Image = new Image(texture);
addChild(image);

衝突判定
半径を指定して、境界と境界がぶつかっているか判定できます。テクスチャは、BitmapData.hitTestによって判定されます。Box2Dのような物理エンジンと組み合わせることも簡単です。衝突判定が複雑になると、レンダリングパフォーマンスに影響しますので、なるべく単純にしてください。

private function onFrame(event:Event):void
{
    point1.x = sausageImage1.x;
    point1.y = sausageImage1.y;
    point2.x = sausageImage2.x;
    point2.y = sausageImage2.y;
	
	if(sausageBitmapData1.hitTest(point2, 255, sausageBitmapData1, point1, 255))
	{
	    trace("touched");
	}
}

Buttons(ボタン)
Starlingのボタンはコンテナ(DisplayObjectContainer)です。テクスチャをスキンとして使います。オートスケールなどの機能があります。

var buttonSkin:Bitmap = new ButtonTexture();
var texture:Texture = Texture.fromBitmap(buttonSkin);
var myButton:Button = new Button(texture, "Play");
addChild(myButton);

Sprite(スプライト)
スプライトもコンテナです。標準のSpriteと同様に、もっとも軽いコンテナです。

Flat Sprites(フラットスプライト)
flatten(描画の更新を止める)を使うと、パフォーマンスを向上させることができます。
コンテナの子供がテクスチャを共有していない場合は、劇的なパフォーマンス向上にはなりません。複雑な親子関係があるものをレンダリングする際に有効です。cacheAsBitmapみたいなものです。

container.flatten();
child.scaleX = child.scaleY = 0.5;
container.unflatten();

MovieClip
スプライトがタイムラインに並んだものです。それぞれのフレームに異なるテクスチャがあります。あらゆる操作ができます。(カスタムフレームレート、addFrame、removeFrameAtなど)
MovieClipのネスト(入れ子)はできません(MovieClipはImageをExtendsしています)。フレームスクリプトはサポートしていません。

var frames:Vector. = sTextureAtlas.getTextures("running_");
mMovie = new MovieClip(frames, 40);

Sprite Sheets(スプライトシート)
スプライトシートを使うと、アニメーションのコマ、スキンなど、たくさんのテクスチャをグループにできます。縦横のマスの数は2のべき乗の数でなくてはいけません(1,2,4,8,16,32...)。Stage3Dの制限は、最大2048×2048です。1枚に入りきれないときは、複数のスプライトシートを作ります。将来のFlash(Flash CS6?)にはスプライトシートの作成を行うパネルが付く予定です。

Juggler(ジャグラー)
ムービークリップのアニメーションを行います。StarlingオブジェクトのデフォルトのJugglerを使えます。あまり使用をおすすめできません。ゲームの各パーツ(背景、メニューなど)で使うとよいでしょう。

var frames:Vector. = sTextureAtlas.getTextures("running_");
mMovie = new MovieClip(frames, 40);
Starling.juggler.add(mMovie);

一時停止と再開
コードのどこからでも、デフォルトのメインジャグラーを使って可能です。Starling.current.start()とStarling.current.stop()は使わないでください。ゲームのメイン部分を構成するクラスとは別のクラスで、それぞれにジャグラーを作ってください。stageクラスにenterframeイベントのリスナー関数を作成し、そこでアニメーションを進めるようにしてください。

private function onFrame(event:EnterFrameEvent):void
{
    if(paused)
	    alertBox.advanceTime(event.passedTime);
    else
	    battle.advanceTime(event.passedTime);
		    if(paused)
    dashboard.advanceTime(event.passedTime);
}

Texture Atlas(テクスチャアトラス)
スプライトシートよりよいです。似たエレメントを1つの大きなテクスチャにまとめることができます。最小のアップロードと、少ないテクスチャ切り替えで済みます。縦横のマスの数は2のべき乗の数でなくてはいけません(1,2,4,8,16,32...)。テクスチャアトラスごとに、似たオブジェクトをまとめてください。

一番下のレイヤーに背景の要素をまとめたテクスチャアトラスを、次のレイヤーにプレイフィールドのテクスチャアトラスを、次のレイヤーにダッシュボードのテクスチャアトラスを描くといいでしょう。

Dynamic Texture Atlas(ダイナミックテクスチャアトラス)
Dynamic Texture Atlas Generatorは、Starlingの拡張機能としてあります。Flashのムービークリップをテクスチャアトラスに変換します。すごい!
それぞれのフレームをラスタライズして、テクスチャを作ってくれます。ゲームの初期化には少し時間がかかるでしょう。初期化の時間とswfのサイズのバランスです。

リソース、それはスプライトの命
使い終わったオブジェクトはdisposeしましょう。
removeEventListers(), removeChild(child, dispose), removeFromParent(true)を使ってリスナーを削除してください。
disposeを呼び出せば、リスナーは削除され、GPUのバッファーからも消えます。テクスチャオブジェクトでは、GPUメモリからテクスチャが消えます。

Native overlay(ネイティブオーバーレイ)
GPUは万能ではありません。textinputをネイティブオーバーレイしたいときは、Starling.current.nativeOverlayを使います。

var textInput:flash.text.TextField = new flash.text.TextField();
textInput.type = TextFieldType.INPUT;
Starling.current.nativeOverlay.addChild(textInput);

Text(テキスト)
Textは必要でしょう。しかも速いやつ。TextFieldとBitmapFont APIがあります。
TextFieldは、レンダリングのためにネイティブのTextFieldを使い、その後GPUにアップロードします。
BitmapFontはビットマップグリフを使います(グリフのスプライトシート)
ゲームのローカライズに便利なオートスケール機能がついています

Particles(パーティクル)
パーティクルはゲームに命を与えます。すごく速い(batching)。1回のコールで描画します。頂点の位置は、CPUで補間されます。

パーティクルの作り方:
http://blog.onebyonedesign.com/flash/particle-editor-for-starling-framework/

プロファイリング
MrDoob StatsクラスがStarlingにポートされています。

Starlingの資料(英語)
www.bytearray.org/?p=3371
からダウンロードできます。(107ページのPDF、無料)


以上、全然60分に収まっていなかったセッションの内容をすべてお伝えしました。

2D描画が高速になって、簡単に使えるフレームワークが登場したことから、簡単に本格的なゲームが、極めて短い時間で作れる時代が来ました。ゲームだけではなく、ウェブサイトのコンテンツ、インタラクティブな展示型コンテンツにも使えると思います。

ぜひStarlingを使って、GPUを使った高速な2Dの表現を試してみてください。モバイル向けのStage 3Dは来年リリースされる予定です。未来はすぐそこまで来ていますよ。

10/11訂正:
スターリンじゃなくて、スターリングと読むのが正しそうです。お詫びして訂正いたします。

 
 
 
2011.10.06 個別ページ
 
 
sh
 

Adobe MAX 2011から「Concurrency in Flash Runtimes」のセッションレポートです。

このセッションのテーマは、Concurrency(コンカレンシー)です。単語としては同時性とか、並行性とかいう意味になります。
Flashは、XMLを解析したり、大きな画像をデコードする処理を行うと、「うっ」と止まってしまいます。これはなんとかならないものかと思いますよね。
スマートフォンでも4コア、2.5GHzのプロセッサが登場する時代に、Flashはまだ同時に1つのことしかできません。重い処理が始まったらそれが終わるまで待たなくてはいけないのです。ところが今日、これを解決する具体的な発表がありました。Flashでも並行処理が行えるようにしようという計画です。未来のFlashのマルチコアアーキテクチャはどのようになるのでしょうか。

以下は全然説明が足りませんが、速報としてお伝えします。

並行処理とは
例えば次のようなFlashがあるとします。

象の絵はずっとアニメーションを続けていますが、大きな背景画像を読み込もうとすると、デコード処理で止まってしまいます。デコードが終わり画像が表示されると、再びアニメーションがはじまります。非常によく体験することですね。ところが未来のFlashでは、デコード処理をバックグラウンドのスレッドで非同期(async image decoding)で行えるようになります。実際に、まったくひっかかりのない様子がデモされました。会場に大きな拍手が起こります。

現在は、レンダリング、I/O(ファイル、DB、ネットワーキング、ソケット)、および画像のデコードが非同期で行えるレベルにあるということです。

非同期のActionScript APIは、
1. ActionScript Request
2. Create Thread
3. Process Request
4. Send Response
5. Dipatch Event
という順序で進みます。

並行レンダリングは、CPUが複数ある場合に、フィルター、Bitblts(bit block transfer)、およびレンダリングに対して行われます。

将来はAsync JSON、Async XML、Background JITも予定されているそうです。

しかしこれで十分といえるでしょうか。
・待ち時間の長い処理(ストラテジーアルゴリズム、物理エンジンなど)
・実行時間の長い処理(PDFの生成、画像処理など)
についてはまだ解決できません。


ActionScript Worker
そこで登場するのが、ActionScript Workers(ワーカー)です。ワーカーというのは、メインの処理とは別に動作するプロセスのことです。ワーカーに仕事を任せることで、メインとは別の処理を「並行して」行うことができます。

なお、専門的な話になりますが、ActionScriptワーカーの特徴は、「何も共有しない(shared nothing)」ということです。

さて、例えば地図で移動経路を検索するとします。ワーカーを使わない場合は、検索している間はFlashが固まったように見え、地図をスクロールさせることはできませんが、ワーカーに検索をやらせれば、検索している間も地図のスムーズなスクロールが可能です。



ActionScript Workerのライフサイクル

ワーカーの作成(creating workers)

var domain:WorkerDomain = WorkerDomain.current;
var url:URLRequest = new URLRequest("abc.swf");
var worker:Worker = domain.createWorkerFromURL(url);

ワーカーの開始と終了(starting & stopping)

var toplevel:Promise = worker.start();
...
var wasRunning:Boolean = worker.stop();

ワーカーのステート(worker states)

NEW → STARTING → RUNNING → FINISHING → STOPPEDと遷移します。


ドメイン

ワーカーの作成

var domain:WorkerDomain = WorkerDomain.current;
domain.createWorkerFromURLRequest(url);
domain.createWorkerFromByteArray(bytes);
domain.createWorkerFromWorker(worker);
domain.createWorkerFromMain();


コミュニケーション

プロミス
プロミスは、ワーカーのアドレス空間にあるオブジェクトのローカル表現です。
(Local Representation of an object residing in a worker's address space.)

var toplevel:Promise = worker.start();
toplevel.foo.bar();
// worker code
package foo
{
    public function bar():void
	{
	    trace("bar");
	}
}

リモートメソッドの呼び出し(remote method invocation)

var barResult:Promise = toplevel.foo.bar();
// worker code
package foo
{
     public function bar():String
	 {
	     return "bar";
	}
 }

プロミスを利用してこのように書きます。イベントみたいなものですかね。

var barResult:Promise = toplevel.foo.bar();
// async
barResult.local::when(function(result:Promise)):void
{
    trace(result.local::receive());
});
// sync
var value:String = String(barResult.local::receive());

引き数の渡し方

var baz:Promise = worker.start();
baz.foo(myObject);
// worker code
public function foo(value:MyObject):void
{
    trace(value.name);
}

ものすごく大きなデータが渡されることを想定して、プロミスを利用してこのように書きます。

var bar:Promise = Primise.wrap(largeObj);
var baz:Promise = worker.start();
baz.foo(bar);
// worker code
public function foo(value:Promise):void
{
    var largeObj:Object = value.local::receive();
	...
}

パイプライン

var baz:Promise = worker.start();
baz.foo();
baz.bar();
baz.foobar("baz");


レンダリング
構造としては、コンテナの上にMainを含む複数のランタイムインスタンスがあって、Shared Display(共有表示オブジェクト)があります。複雑な計算を伴うものを表示をしようとする場合、ワーカーを使わないとフレームレートがガクンと落ちる瞬間がありますが、ワーカーを使ってバックグラウンドレンダリングを行えばフレームレートは落ちません。

WorkerView

var view:WorkerView = worker.view;
view.viewport = new Rectangle(0, 0, width, height);
addChild(view);


セキュリティ制約
Mainと各ワーカーは同じドメインにある必要があります。


セッションで紹介されたのはPre-Alpha版という、開発のごく初期段階のもので、Flash Player 12に搭載されるかどうか分かりません。しかしこれはStage 3Dと並んで、Flash Playerの非常に大きな進化をもたらす技術であると感じました。

 
 
 
2011.10.05 個別ページ
 
 
sh
 

Adobe MAX 2011から、Sneak Peeks(「こっそり見せる」という意味)の様子をレポートします。まじめに進めようとする担当者を、Rainn Wilsonというコメディアンがじゃまするという構成で、なかなか面白かったです。


セットやビルに見えるものは、なんと全部映像です。3億ピクセルの動画だとか。


今年のSneak Peaksでは11個のデモが紹介されました。

1. Local Layer Ordering(部分的なレイヤー順序入れ替え)
レイヤーの前後関係を部分的に入れ替えることができる機能です。アニメーションでも3Dでも。PhotoshopやFlashなど、レイヤーがあるソフトに搭載される機能なのではないかと思います。


太陽のレイヤーの一部は基本的に、花のレイヤーよりも下にありますが、その一部が花より手前に描かれています。

2. Automatic Dialogue Replacement(自動音声置換機能)
Preimiereの機能。アフレコ(アテレコ?)した音声を、元の音声のタイミングに合わせて、映像に自動合成する機能。合わせる音声は、なんと他人の音声でもよい(!)

3. リキッドレイアウト機能
電子書籍向けInDesignの機能。いろんな縦横比のタブレットが登場し、縦位置も横位置もあってそれぞれレイアウトしなおすのは大変です。この機能は縦とか横とか指定すると、自動的にレイアウトし直してくれる機能。HTML/CSS/JSで実現しているので、表示時にリキッドにも(アダプティブに)変更してくれます。Googleマップや、Adobe Edgeのアニメもコピー&ペーストで簡単に入れることができます。

4. Auto Sync of Crowd Sourced Video(クラウドのビデオの自動同期)
Premiereの機能。例えば、いろんな人が1つのコンサートの様子をそれぞれのホームビデオカメラで撮影した映像を、自動で全部同期させてしまう凄い機能。それぞれの動画の音を解析してタイミングを合わせているようです。


それぞれはじまりも終わりも違うのに、自動でぴったり合わせてしまう。

5. Flash Builder Reverse Debugging(リバースデバッグ機能)
リバースデバッグ(ステップ実行を逆方向に行う)機能。時間を逆に戻れるなんてすごい。

6. Near Field Communications for AIR(Felicaみたいなもの?)
例えばDVDにスマートフォンを近づけるだけで、映画の予告動画が見られるなど。NFC同士でも、デバイス同士でも。ANE(Adobe Native Extension)で実現されています。

7. Pixel Nuggets(類似画像検索機能)
PhotoshopとかLightroom向けの機能だと思います。写真が増えて、数千の写真からどうやって検索するかが課題になっています。この機能はそれを解決する新しいビジュアルサーチ。ある写真と被写体が同じ写真を自動的に見つける機能です。写真の一部を選択し、その部分が一致する写真だけを探すこともできます。

8. Monocle(Flash/AIRのプロファイルモニタと解析の機能)
Flash/AIRの機能。フレームレート、レンダリング、ActionScript実行時間がリアルタイムにワイヤレスで送られてきて、フレームごとにグラフで表示されます。フレームを選択し、より詳細な情報を表示することも可能。

9. Video Meshes(ビデオのリアルタイム3D編集)
Premiereの機能。ビデオ映像の中の空間を解析して3Dのメッシュ情報に変換。その上で、カメラや映像の中の人物を動かしたり、増やしたりすることができる機能。ボケ、ピントの変更までもリアルタイムで。


2次元の映像から、3D空間のメッシュを自動で作成。


人を増やしたり、カメラを動かしたりできる。

10. GPU Parallelism(GPU並列処理)
FlashアプリケーションのCPUで行っている処理の一部を、自動的にGPUに移して並行処理する機能(すみません、なんだか翻訳に自信がありません)。パーティクルの処理が、劇的に軽くなっていました。

11. Image Deblurring(手振れ補正機能)
Photoshopの機能。手振れ写真を自動的に、鮮明な写真に補正。下の写真は、そもそも僕の撮影が手振れしているのでわかりづらいですが、補正のクオリティがすごいです。


手振れしてしまった写真も・・・


こんなにくっきり写真に(僕の撮影がブレていて分かりにくいですが)


モバイル端末で撮った写真の小さな文字も・・・


ほらこの通り、読めるようになった!


以上です。みなさんはどんな機能が気になりましたか?
僕は、Flashのプロファイルモニタ、写真の手振れ補正などすぐ欲しい機能もありましたが、なんといってもPremiereの機能はすごいですね。Adobe社の技術研究のレベルの高さを思い知らされたSneak Peaksでした。

 
 
 
2011.10.05 個別ページ
 
 
sh
 

Adobe MAX 2011から「Flash Player 11 and Adobe AIR 3: Changing the Game」のセッションレポートです。

セッションはまず任天堂の横井軍平さん(1941-1997)の話からはじまり、驚きました。ゲーム&ウォッチは、確かにゲームというものを変えたと思います。

現代、僕らが相手にしているのは、PC、スマートフォン、タブレットなどです。(講師は)リッチで、流れるような、没入感のある、素晴らしい体験を生み出すことこそが、ゲームを作るということだと考えています。FlashはもはやWeb上のゲーム機といえるでしょう。講師は「We are launching the next-generation console」と言っていました。


進化した2D、3D描画

Flash Player 11では、描画はGPUを利用するようになり、映画のようで、しかも60fpsのなめらかな描画が可能になりました。これは、Stage 3Dという技術によって実現されています。
一番下にコンピューターの画像処理を行うGPU、その上にOpen GLやOpen GL ES 2.0、DirectXが乗っています。その上にStage 3Dがあり、その上にみなさんが使うフレームワークが乗り、その上にActionScriptがあるというイメージです。

フレームワークは、2Dや3Dの処理を簡単に書くためのライブラリです。2Dのフレームワークには、Starling(スターリング)や、ND2D、ReMXなどがあります。3Dフレームワークには、Alternativa3D、Away3D、Flare3D、Minko、Mixamo、Prosceniumなどがあります。

描画速度はこれまでの1000倍以上です。では、GPUが使えない5年前のパソコンではどうするのでしょうか?Stage3Dには、GPUが使えない場合には、Flash Player 10以前のようなソフトウェアレンダリングがありますが、これも10の時より2〜10倍速くなっているそうです。
なお、Stage 3DのモバイルリリースはEarly next year(来年の早い時期)ということでした。 実際にHTCのデバイスで動いているStage3Dのデモ映像が披露されました。

また、ビデオ再生もCPUをほとんど使わなくなりました。1080pビデオを30fpsで再生できます。
Stage Videoと呼ばれています。デスクトップもモバイルも、そしてiOSも対応しています。


Flash Player 11/AIR 3までに、何ができるようになったか

グラフィックス
・強力なラスター、ベクターグラフィックス
・なめらかで効率的な1080p HDビデオ
・GPUによる「本物の」3D(Stage 3D)。レンダリングは1000倍速くなった
・サイズ無制限のBitmap
・3次ベジェ曲線

入力
・ネイティブのマウス、キーボード、マルチタッチ、加速度センサーサポート
・カメラとマイクの入力
・前面カメラのサポート
・高品質なH.264ビデオエンコーディング
・ネイティブモード拡張性(Native Extension for AIR)
 センサー、マルチスクリーン、デバイスの状態、NFC(Near Field Communication)など

ロジック
・速くて、生産的な言語(ActionScript 3.0)と、VM(バーチャルマシン)
・64bitアーキテクチャ
・速くてネイティブのJSONサポート
・スムースなガベージコレクション(GC)のスケジューリング

インスタントプレイ
・Flashなのですぐ遊べる
・ウェブとAppストアで配信できる
・インスタントアプリケーションインストール(追加ダウンロードなし)
・SWFサイズを最大40%削減(LZMA圧縮)
・小さくて高品質なJPEG-XRサポート
・非同期のBitmapデコード(優れた応答性)

ほかにも、進化したダイナミックオーディオ、低遅延のP2Pマルチプレイヤーネットワーク、高品質なボイスチャットなどなど。しかしなんといっても、その一貫性と、10億人以上にリーチできるということが、Flashの最大の機能といえるでしょう。

Flash Player 11とAIR 3は今日公開されました。
45%のFlash Playerは30日以内にバージョン11にアップデートされます。年内に80%普及する見通しです。


次はどうなる?
テレメトリー、低遅延のオーディオ、並列処理、マウスの右と真ん中クリック、Molehill 2、VMの改良、言語の改良(ActionScript 3.xとか4.0とか)、マウスのデルタ(ホイールの調整)とロック、フルスクリーンのテキスト入力、JDI(Just Do Itと呼ばれる小さいがインパクトのある機能いろいろ)というキーワードが挙げられ、セッションは終わりました。


1つのセッションは60分間なのですが、本当にこれだけの内容をよく盛り込んだなと感じました。

新しい2Dと3D、フレームワークが多すぎてどれを勉強してみたらいいか分からない人には、機能、学習コスト、将来性、生産性、ライセンスなどを総合的に考えると、2DはStarling(スターリング)が、3DはProscenium(プロセニアム)がおすすめです。

さて、Flash/AIRは一体どこまで進化するのでしょうか。一連の騒動で、Flashはもはやこれまでかと感じた人も多かったことでしょう。しかし僕は、むしろFlashはやっとスタートラインに立ったところのような気がしています。

ゲーム機やネイティブアプリと変わらないようなゲームが、Flashで作れるようになりました。これまでFlashにあった、様々な表現上の制限が消えてなくなります。

そういえば基調講演のタイトルは「Creativity Unleashed」でした。まさに解き放たれた時代が訪れているように感じます。

10/14訂正:
スターリンじゃなくてスターリング、プロセニウムじゃなくてプロセニアムと読むのが正しそうです。お詫びして訂正いたします。

 
 
 
2011.10.04 個別ページ
 
 
sh
 

Adobe MAX 2011から「The Incubator: Test the Bleeding-Edge Capabilities of the Flash Platform」のセッションレポートです。

なんのことかと思ったら、なんとFlash Player 12以降のお話でした。

Flash Player 11には、Stage3Dなどの有名な新機能のほかに、JDI(Just Do It)と呼ばれるコミュニティーがリクエストした機能、忘れられていたAPIが盛り込まれています。プレイヤーの機能開発としては小さなものだそうですが、どれもインパクトのある機能です。

Flash Player 11のJDI
・大きさ無制限のBitmap。描画APIを使った場合も凄く大きいところに描ける。大きすぎるときは勝手に内部で分割する?(著者未確認)
・MovieClip.isPlaying()
・DisplayObjectContainer.removeChildren()
・Sound.loadPCMFromByteArray() 16bit int, 32bit float
・Sound.loadCompressedDataFromByteArray() MP3のみ
・LZMA SWF圧縮(SWF13以降、Flash Pro CS6以降)
・JPEG-XR画像読み込み

これらも凄いが、でも、これで止まるわけにはいかない!

まもなくIncubatorに入るもの
・BitmapData V2.0
・Soundオブジェクトがさらなるフォーマットに対応
 AAC/ADTS (streaming)
 AAC/MP4 (iTunes)
・StageVideo.attachCamera() / Stage3D.transparency
・Camera.drawBitmapData() / Camera.copyToByteArray() / renderイベント.
・ThrottleEvent
・Context3D.setProgramConstantsFromByteArray()

BitmapData V2.0とは?
忘れられていたAPI
・BitmapData.draw2()
 レンダリング品質としてlow, medium, highを指定できるdraw
・BitmapData.compress()
 PNG, JPEG, JPEG-XR

最適化されたAPI
・BitmapData.flip(mode:String):void;
・BitmapData.resize(new_width:int, new_height:int, mode:String):void;
・BitmapData.mipmap():void;
・BitmapData.grey(format:String, colorTransform:ColorTransform):void;
・BitmapData.crop(r:Rectangle):void;
・BitmapData.copyToByteArray(rect:Retangle, destination:ByteArray):void;
・BitmapData.copyToVector(rect:Rectrangle, destination:Vector.):void;

画像処理のための高度なフィルタ
・BitmapData.integral()
・BitmapData.sobel()
・BitmapData.laplacian()
・BitmapData.canny()

新しい内部フォーマット群
・format_rgba_8: 4 bytes/pixel, RGB + alpha(これまでのもの)
・format_bgrx_8: 4 bytes/pixel, RGB + Unused component
・format_l_8: 1 byte/pixel, grey
・format_la_8: 2 bytes/pixel, grey + alpha
・format_l_32f: 1 float/pixel, grey
・format_la_32f: 2 floats/pixel, grey + alpha
・format_rgba_32f: 4 floats/pixel, RGB + alpha

JDIのリストにあるもの(調査中)
・右クリック、真ん中クリックのサポート(Flash Player)
・フルスクリーン時のマウスロック
・ApplicationDomain.getDefinitions()
・Vector.sortOn()
・BitmapのクリップボードAPI(Flash Player)
・同期Loader.loadBytes()
・FrameLabelイベント

「Broadcastレンダリング」(Flash Player)
これまでのFlashのQuality設定
Low (アンチエイリアスなし)
Medium (2x2 アンチエイリアス)
High (4x4 アンチエイリアス)
Best (4x4アンチエイリアス+oversampled bitmap downscale)
新しいQuality設定
Broadast (16x16 autoplay only)

リニアブレンディング
ブラーかけた紫と水色のオブジェクトを重ねても、間が黒くならない。


いかがでしたか。セッションタイトルからは想像もつかない、わくわくする内容だったと思います。デモで使われていたプレイヤーにははっきりと「Flash Player 12」と書いてありました。

僕は、グレースケール化、画像処理系のフィルタ関数、Vector.sortOn()などにぐっときました。可能性がとても広がる機能だと思います。

実際に次のバージョンで載る機能かどうかまだ分かりませんが、Flash Playerは、ユーザーの声を聞き、忘れられていたAPIもちゃんと載せながら、進化をしていくようです。

 
 
 
2011.10.04 個別ページ
 
 
sh
 

Adobe MAX 2011から「The Flash Platform and Alternativa3D: Amazing New Possibilities」のセッションレポートです。

Flash Playerにおける3Dの表現は、Flash Player 10までは極めて限られたものでした。ソフトウェアレンダリングといって、CPUが一生懸命計算しながら描くので、パソコンの処理を重くする割には、ライトもシェーディングも影も満足に描画できませんでした。

Flash Player 11では、GPUという、ハードウェアに搭載されている描画専用の装置を使って描くので、非常に豊かな表現ができるのに、パソコンの処理が重たくなりません。

アドビはStage3Dというライブラリを提供していますが、これは非常に低レベル(コンピューターの中の処理に近いレベル)のものなので、誰にでも簡単に使えるものではありません。そこで開発者は、Alternativa3D, Flare 3D, Away 3D, IceField 3D、あるいは発表されたばかりの(Adobe) Prosceniumなどのフレームワークを使うことになります。

このセッションは、その1つ、Alternativa3Dに関するものです。

左がこれまでのFlash Player、右が新しいFlash Player 11です。ポリゴン数(緻密さ)に雲泥の差があることがよくわかります。

3Dのゲームソフトでは当たり前の質感、光、影の表現がFlash Playerでも行えるようになりました。

Alternativa3Dは、単にフレームワークを提供するだけでなく、シーンエディタや物理エンジンも合わせて提供すると発表されました。

ゲームの用に非常に複雑な仮想空間を描くには、単にフレームワークだけでは何もできないということでしょう。Alternativa3Dは、さらにマルチプレイヤーサーバーについてもレベニューシェアライセンスで提供。トータルなプラットフォームとして進化していくようです。(クライアントは引き続き無料)

昨年同様、具体例などもっとつっこんだ話があるかと思いきや、概要だけで早い時間に終わってしまうという、セッションとしてはちょっと期待はずれなものでした。

 
 
 
2011.10.04 個別ページ
 
 
sh
 

昨年に引き続き、ロサンゼルスで開催されているAdobe MAX 2011に参加しています。

この記事は、基調講演を現地で聞いて印象に残ったものをまとめたレポートです。期間中は@spacelogueでリアルタイムにtweetしていますのでもしよかったらご覧ください。

Adobe Creative Cloud(アドビクリエイティブクラウド)

クラウドというと単にサーバーやシステムのような印象ですが、クリエイティブサービス、クリエイティブコミュニティ、クリエイティブアプリを総称した名称です。

「アプリ」の定義には、今回発表されたツール類だけでなく、従来のCS各製品も含まれています。アドビのアプリケーションは箱をたくさん買っていた時代から、購入してダウンロードする時代になりました。やがてダウンロードさえしなくなるのかもしれません。

1. クリエイティブサービス
20GBという容量のストレージ、Business Catalystに加え、Webフォントを提供するフォントサービス、個人でも電子出版ができるAdobe Digital Publishing Suite Single Editionが発表されました。

フォントサービスのtypekit.com(アドビ社はTypekit社を買収しました)では、ブラウザごとの見え方の違いを確認する機能も紹介されていましたが、日本語フォントのサービスは容量や権利の関係からなかなか実現が難しいのではないかと思います。でもぜひやって欲しいですね。

2. クリエイティブコミュニティ
例えば、PSDをクラウドに上げて、ウェブ上でレイヤーをON/OFFしたりできる、共有のためのサービスのようです。ファイルをアップロードして、誰かがダウンロードするという共有もどきのやり取りがなくなり、常に簡単にクラウドサーバーとだけ同期できるようになるということでしょうか。

3. クリエイティブアプリ
Adobe Touch Appsというアプリケーション群が発表されました。すでに発表されていた、Adobe Ideas、Adobe Carousel(カルーセル)に加え、カラーパレットの共有サービス「Adobe Kular(クーラー)」、ポートフォリオを管理する「Adobe Debut(デビュー)」、画像をコラージュする「Adobe Collage(コラージュ)」が発表されました。どれも、タッチインターフェイスならではの工夫がされており、かつクラウドを利用することが前提のものになっています。直感的に作業した結果を、デスクトップにもってきたり、その逆が簡単に行えるようになっています。

プロトタイプ作成ツール「Adobe Proto」
また、Webページのプロトタイプ作成を補助する「Adobe Proto(プロト)」も発表されました。指で波線を描くとダミーテキストが、4つの指でタッチして縦に線を引くとメニューバーが、Zの文字を描くと画像エリアが、再生マークを描くと動画プレイヤーが現れます。あとはサイズや位置を変更するだけ。タッチ操作ならではの直感的な操作で、「とりあえずこんな感じのレイアウトにしてみようか」というアイデアをすぐ形にできそうです。
お決まりの要素をいかに簡単にならべられるかというところに特化していて、個人的には非常に可能性を感じました。おまけ機能(?)として、HTMLも書き出すことができ、もちろんDreamweaverで見ることもできます。


最後に、Photoshop Touch。筆圧感知可能なペン付きのサムソンの新タブレットでデモされたので、これはもしや昨年に引き続き全員にプレゼントかと思いましたが、そんなことにはなりませんでした。代わりに、Adobe Creative Cloudの1年無料権が参加者全員に配られると発表され、基調講演は終わりました。


果たしてプロのデザイナー、エンジニアののワークフローを劇的に変えるような発表があったかというと、今のところちょっと分かりません。しかし、アドビがクラウドと真剣に向き合っていることが分かり、ほっとした気もします。これからのさらなる発表に期待したいところです。

 
 
 
2011.10.03 個別ページ
 
 
sh
 

今年もAdobe MAXがロサンゼルスで行われます。
さまざまなセッションに参加し、Flashを中心に最新情報をお伝えします。

次のようなセッションに参加し、このうちいくつかについてレポートしますので、どうぞご覧ください。(予定は都合により変更となる場合があります)

1日目
・基調講演「Creativity Unleashed」
・The Flash Platform and Alternativa3D: Amazing New Possibilities
・The Incubator: Test the Bleeding-Edge Capabilities of the Flash Platform
・Deep Dive into Molehill (Stage 3D)

2日目
・Flash Player 11 and Adobe AIR 3: Changing the Game
・基調講演「Creating the very best user experiences」
・Flash Gets Physical: Connecting with Game Controllers, Arduino, and Sensors
・Developing 2D Games on Top of Stage 3D (Molehill) in Flash Player
・Adobe Video Solutions Roadmap
・MAX Sneak Peeks and Awards

3日目
・Developing Next-Generation Games with Stage3D (Molehill) Part 1
・Concurrency in Flash Runtimes
・Flash Professional Sneak Peek: A Glimpse at the Future
・Deploying Flash Professional Content across Screens
・Flash and 3D, Start Your Engines!
・Beautiful Typography: A Crash Course